我希望构建一个Prolog程序来确定作为参数提供的两个列表是否不相等。
目前我已经完成了以下工作。
目前我已经完成了以下工作。
not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).
not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).
?- [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
这是我想出来的:
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.
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
dif/2
是一个可靠的选项:?- dif([1,2],[1,X]). ===> dif(X, 2).
- false