Prolog,用于确定两个列表是否不相等的程序

Prolog,用于确定两个列表是否不相等的程序,prolog,Prolog,我想构建一个Prolog程序来确定作为参数提供的两个列表是否不相等 这就是我到目前为止所做的 not-equal([],[a|_]). not-equal([a|_],[H|T]):-not-equal(a,T). 以下是我的想法: not-equal([],[H|_]). not-equal([H|_],[]). not-equal([H|T1],[H|T2]) :- not-equal(T1,T2). not-equal([H1|T1],[H2|T2]) :- not(v

我想构建一个Prolog程序来确定作为参数提供的两个列表是否不相等

这就是我到目前为止所做的

not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).

以下是我的想法:

not-equal([],[H|_]).
not-equal([H|_],[]).
not-equal([H|T1],[H|T2]) :-
    not-equal(T1,T2).

not-equal([H1|T1],[H2|T2]) :-
    not(var(H1)),
    not(var(H2)),
    H1 =\= H2.
在谓词中有一个小写的“a”,它是原子而不是变量。另外,当您调用
notequal(a,T)
时,您将超出使用列表的范围,因此它将不起作用

我也会考虑将谓词的名称改为<代码>不能统一的< /COD>。因为列表可能包含变量,这些变量可以使它们相等或不取决于将来这些变量是如何统一的。 仍然有一些情况不适用于我的上述代码

作为替代,我会考虑使用<代码> = < /Cult>运算符,像这样:

not-equal([H1|T1],[H2|T2]) :- not([H1|T1]?=[H2|T2]).

让我知道这些是否有帮助。

序言列表只是可以直接使用相等运算符“比较”的术语。不相等可能意味着不统一或不相同

不统一

不完全相同


请注意,
不等于(X,Y)
是一个带有主函子
(-)/2
的术语。改用
不相等(X,Y)
。对于
(?=)/2
,对于相同的和不可分解的术语,这是成功的。因此,你因不相等([X],[Y])而失败。
dif/2
是一个合理的选择:
?-dif([1,2],[1,X])。=>dif(X,2)。
?- [1, 2] \= [1, 2].        ===> false
?- [1, 2] \= [1, X].        ===> false
?- [1, 2] \= [1, 3].        ===> true
?- [1, 2] \== [1, 2].        ===> false
?- [1, 2] \== [1, X].        ===> true
?- [1, 2] \== [1, 3].        ===> true