1

是否可以使用已经内置的谓词(在 swi-prolog 中)获得一个谓词,例如:

Wanted_Pred(X, a) %false
Wanted_Pred(b, a) %false
Wanted_Pred(X, Y) %true
Wanted_Pred(X, X) %true
Wanted_Pred(X, [Y|Z]) %false
Wanted_Pred([A|B], [X,Y|Z]) %false
Wanted_Pred([A,C|B], [X,Y|Z]) %true

例如,如果两个参数都代表彼此自由变量重命名,则成功,请注意 copy_term 不会这样做,因为它最终统一了参数:

copy_term(X, a) %true 
copy_term(X, [Y|Z]) %true
copy_term([A|B], [X,Y|Z]) %true
4

2 回答 2

4

subsumes_term /2 完全符合您的要求,只需交换参数:

?- subsumes_term(a,X).
false.

?- subsumes_term(a,b).
false.

?- subsumes_term(Y,X).
true.

?- subsumes_term(X,X).
true.

?- subsumes_term([Y|Z],X).
false.

?- subsumes_term([X,Y|Z],[A|B]).
false.

?- subsumes_term([X,Y|Z],[A,C|B]).
true.

我在 SWI-Prolog 邮件列表上看到了一个关于(=@=) /2 的有效实现的相当新的线程,我认为它是相关的(实际上,它也满足您的要求):充分利用它应该是可用的最佳选择。

编辑更正邮件列表的链接。最近将列表托管切换到 google 组使存档不可用...

例如,您可以在存档讨论中找到该主题,搜索作者 Kuniaki Mukai

于 2012-09-26T07:16:50.230 回答
0

这是我正在搜索的谓词,但 我想知道这种谓词是 BUILT_IN 还是 SWI-PROLOG中的类似谓词。

true_copy(X, Y) :-
    (X == Y, !);
    (var(X), var(Y), !);
    ((var(X); var(Y)) -> !, fail);
    (atom(X), atom(Y) -> !, fail).

true_copy([X | L1], [Y | L2]) :-
    !,
    true_copy(X, Y),
    true_copy(L1, L2).

true_copy(Term1, Term2) :-
    Term1 =.. L1,
    Term2 =.. L2,
    true_copy(L1, L2).  
于 2012-09-26T00:38:52.710 回答