Можно ли использовать переменную head в качестве имени функтора в теле? - PullRequest
0 голосов
/ 29 апреля 2020

Пролог позволяет объединять составные термины с переменными:

token(1,2,3).
token(4,5,6).

token_term(Term, X, Y, Z) :- Term=token(X, Y, Z).
? token_term(Term, 1,2,3).
T = token(1, 2, 3).

Как мы можем сделать более общую версию для любого имени функтора:

? term(Term, token, 1,2,3).
T = token(1, 2, 3).

Кажется следующее не допускается синтаксис:

term(Term, F, X, Y, Z) :- Term=F(X, Y, Z).

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Зачем тебе это вообще нужно? Во многих ситуациях вы не хотите создавать составной термин, вместо этого вы можете захотеть построить цель. Таким образом, вместо

term(Term, F, X, Y, Z) :- Term=F(X, Y, Z).

вы можете сказать:

term(call(F,X,Y,Z), F, X, Y, Z).

Результирующий термин будет вызываться именно так, будет называться составной термин.

?- term(G_0, token, 1, 2, 3).
   G_0 = call(token, 1, 2, 3).

Нет никакой разницы между этим термином и token(1, 2, 3), когда вы просто звоните,

0 голосов
/ 29 апреля 2020

Спасибо @ GuyCoder

% Convert F, [X_0, X_1, ....] into a term
% if a match can be made.
% e.g. term(T, tok, [1,2,3])  --> tok(1,2,3) IFF tok(1,2,3)
find_term(Term, F, X) :- Term =.. [F|X], Term.

% Term constructor
term(Term, F, X) :- Term =.. [F|X].
?- assertz(token(4,5,6)).
true.

?- assertz(token(1,2,3)).
true.

?- find_term(T, token, [1,_,_]).
T = token(1, 2, 3).

?- find_term(T, token, [_,_,_]).
T = token(4, 5, 6) ;
T = token(1, 2, 3).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...