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

时间:2011-10-19 01:47:26

标签: prolog

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

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

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

2 个答案:

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

如果这些有帮助,请告诉我。