Prolog中有效的match_chk / 2谓词

时间:2015-05-23 11:15:33

标签: prolog matching

我想检查两个术语,如果它们可以通过=/2匹配,并且在检查期间不应该绑定任何变量。

例如:match_chk/2

| ?- match_chk(X, a).
true. % without any binding

这可以通过两次使用非对称subsumes_term/2来完成,但这似乎效率低下,因为可能需要扫描两次。

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

1 个答案:

答案 0 :(得分:1)

由于Prolog将否定视为失败实现否定,当\+ Goal成功时,不会返回任何绑定。如果你想知道两个术语是否是 unifiable ,你可以简单地使用双重否定

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

或者,如果您愿意,可以像@passaba por aqui评论一样:

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