Prolog,用于确定两个列表是否不相等的程序
我想构建一个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
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