Prolog中一个有效的匹配chk/2谓词

Prolog中一个有效的匹配chk/2谓词,prolog,matching,Prolog,Matching,我想检查两个术语是否可以通过=/2匹配,并且在检查过程中不应绑定任何变量 例如:match\u chk/2 | ?- match_chk(X, a). true. % without any binding 这可以通过使用不对称两次来完成,但这似乎效率低下,因为可能需要扫描术语两次 match_chk(A, B) :- ( subsumes_term(A, B) ; subsumes_term(B, A) ), !. 由于Prolog将否定实现为否定作为失败,因此当\

我想检查两个术语是否可以通过
=/2
匹配,并且在检查过程中不应绑定任何变量

例如:
match\u chk/2

| ?- match_chk(X, a).
true. % without any binding
这可以通过使用不对称两次来完成,但这似乎效率低下,因为可能需要扫描术语两次

match_chk(A, B) :-
    ( subsumes_term(A, B)
    ; subsumes_term(B, A)
    ), !.

由于Prolog将否定实现为否定作为失败,因此当
\+目标
成功时,不会返回任何绑定。如果您想知道两个术语是否可以统一,则可以简单地使用双重否定:

unifiable(Term1, Term2) :-
    \+ \+ Term1 = Term2.
或者,如果您愿意,如@passaba por-aqui评论:

unifiable(Term1, Term2) :-
    \+ Term1 \= Term2.

无效简单?:\+(a\=B)是否希望
匹配chk(X+Y,Y+X),匹配chk(X+B,a+Y)
失败?不清楚你所说的“可匹配”是什么意思。事实上,对于什么是“匹配”,有几个一致的定义(我马上想到三个)。。。。实际上,有四种不同的含义…对不起,我指的是prolog的默认
=/2
匹配。我把它添加到了帖子中。@pasaba por-aqui,你可以写下你的评论作为回答。