是否有可能获得已经内置的谓词(在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
e.g。成功iff两个参数代表彼此自由变量重命名, 请注意,copy_term不会这样做,因为它最终统一了参数:
copy_term(X, a) %true
copy_term(X, [Y|Z]) %true
copy_term([A|B], [X,Y|Z]) %true
答案 0 :(得分: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的有效实现的最新帖子,我认为它是相关的(实际上,它也满足了你的要求):好好利用它应该是最好的选择。
修改更正邮件列表的链接。最近切换列表'托管到谷歌群组使归档不可用...
您可以在archived discussions找到该帖子,搜索作者Kuniaki Mukai
答案 1 :(得分:0)
这是我正在搜索的预测,但是 我想知道如果这种预测是在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).