我想构建一个Prolog程序来确定作为参数提供的两个列表是否不相等。
这是我到目前为止所做的。
not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).
答案 0 :(得分:6)
Prolog列表只是可以使用相等运算符直接“比较”的术语。 不相等可能意味着不可统一或不相同。
不可统一
?- [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
答案 1 :(得分:0)
以下是我提出的建议:
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',它是一个原子,而不是一个变量。此外,当您致电not-equal(a,T)
时,您将不再使用列表,因此无法使用。
我还考虑将谓词的名称更改为not-unifiable
,因为列表可能包含可能使它们相等或不相同的变量,具体取决于这些变量在未来的统一方式。
仍有一些案例无法使用我的上述代码。
作为替代方案,我会考虑使用?=
运算符,如下所示:
not-equal([H1|T1],[H2|T2]) :- not([H1|T1]?=[H2|T2]).
如果这些有帮助,请告诉我。