Происходит проверка дружественной структуры функций Пролога unify
Структуру объектов иногда идентифицируют с открытыми картами. Затем они могут быть представлены в виде открытых списков Пролога с использованием оператора (:) / 2 для объединения в пары. Этот термин функции:
Дала бы этот термин Пролога:
[number:sg, person:3 | _ ]
Код для унификации структуры функций часто приводится как, взятый из этого руководства здесь :
unify0(Dag,Dag) :- !.
unify0([Feature:Value|Rest],Dag) :-
val(Feature,Value,Dag,StripDag),
unify0(Rest,StripDag).
Но это не очень удобно для проверки. Шаблон Dag, Dag вызывает унификацию между фактическим первым аргументом unify0 и фактическим вторым аргументом вызывающего unify0. Эта попытка объединения предпринимается снова и снова.
Есть ли лучшие реализации?