是否可以使用已经内置的谓词(在 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
Run Code Online (Sandbox Code Playgroud)
例如,如果两个参数都代表彼此的自由变量重命名,则成功,请注意,copy_term 不会这样做,因为它最终统一了参数:
copy_term(X, a) %true
copy_term(X, [Y|Z]) %true
copy_term([A|B], [X,Y|Z]) %true
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
我在 SWI-Prolog 邮件列表上看到了一个关于(=@=) /2 的有效实现的相当新的线程,我认为它是相关的(实际上,它也满足您的要求):充分利用它应该是可用的最佳选择。
编辑更正邮件列表的链接。最近将列表托管切换到 Google 群组,导致存档不可用...
例如,您可以在存档讨论中找到该主题,搜索作者 Kuniaki Mukai