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

3
我希望构建一个Prolog程序来确定作为参数提供的两个列表是否不相等。
目前我已经完成了以下工作。
not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).
2个回答

8
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

dif/2 是一个可靠的选项:?- dif([1,2],[1,X]). ===> dif(X, 2). - false

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

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


请注意,not-equal(X,Y) 是一个具有主要函数符号 (-)/2 的术语。请改用 not_equal(X,Y)。至于 (?=)/2,它成功匹配相同的 不可统一的术语。因此,对于 not_equal([X],[Y]),您会失败。 - false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接