谓词检测是否指定了Prolog术语(变得更具体)

时间:2012-09-25 23:32:14

标签: prolog

是否有可能获得已经内置的谓词(在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

2 个答案:

答案 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).