Prolog 无原因的序言错误

Prolog 无原因的序言错误,prolog,prolog-dif,Prolog,Prolog Dif,我创建了下面的脚本,然而,它给我带来了一个错误,即使从我的角度来看,它是完全正确的。原因可能是什么 remove_repeats([],[]). remove_repeats([X],[X]). remove_repeats([X,X],[X]). remove_repeats([X,Y],[X,Y]):-X=\=Y. remove_repeats([H,H|T],R):-remove_repeats([H|T],R). remove_repeats([H1,H2|T],R):- H1=\=H2

我创建了下面的脚本,然而,它给我带来了一个错误,即使从我的角度来看,它是完全正确的。原因可能是什么

remove_repeats([],[]).
remove_repeats([X],[X]).
remove_repeats([X,X],[X]).
remove_repeats([X,Y],[X,Y]):-X=\=Y.
remove_repeats([H,H|T],R):-remove_repeats([H|T],R).
remove_repeats([H1,H2|T],R):- H1=\=H2, remove_repeats([H2|T],Z), R=[H1|Z]. 
当我运行以下命令时:

remove_repeats([a,b,b,c,c,c,c,c,d],Result).
它向我抛出以下错误:

ERROR: =\=/2 :Arithmetic: 'a=0' is not a function

给出的错误确实有原因。:)


=\=/2
是一个算术运算符,用于比较两个算术表达式的值是否相等,如果它们不相等,则会生成成功(true)。如果您试图在非数字术语上使用它,它将生成错误

如果要检查术语是否不相同,可以使用
\=
。比如说,

?- a \== b.
true.

?- X \== a.
true.
如果要检查“不可统一”,请使用
\=

?- a \= b.
true.

?- X \= a.   % X could be unified with 'a' to make them equal
false.
这本身将使谓词工作,尽管它不止一次地找到了解决方案:

?- remove_repeats([a,b,b,c,c,c,c,c,d], Result).
Result = [a, b, c, d] ;
Result = [a, b, c, d] ;
false.

?-
虽然逻辑本身没有错误,但可以进行一些清理

remove_repeats([], []).
remove_repeats([X], [X]).
remove_repeats([X,X], [X]).
remove_repeats([X,Y], [X,Y]) :- X \= Y.
remove_repeats([H,H|T], R) :- remove_repeats([H|T], R).
remove_repeats([H1,H2|T], R) :-
    H1 \= H2,
    remove_repeats([H2|T], Z),
    R = [H1|Z].
子句
remove_repeats([X,X],[X])。
是多余的,因为它已经由
remove_repeats([H,H | T],R)
处理。后跟
remove_repeats([X],[X])
。此外,子句
remove_repeats([X,Y],[X,Y]):-X\=Y.
也是多余的,因为它将由
remove_repeats([H1,H2 | T],R).
remove_repeats([X],[X])处理。
。然后,我们可以通过将
R
的统一放在子句的开头来整理最后一个子句:

remove_repeats([], []).
remove_repeats([X], [X]).
remove_repeats([H,H|T], R) :- remove_repeats([H|T], R).
remove_repeats([H1,H2|T], [H1|Z]) :-
    H1 \= H2,
    remove_repeats([H2|T], Z).
消除冗余规则也会消除冗余结果,因为解决方案不会有多个方法满足规则:

?- remove_repeats([a,b,b,c,c,c,c,c,d], Result).
Result = [a, b, c, d] ;
false.

?-

编辑


正如@false在他的评论中指出的,如果您使用的是SWI-Prolog,那么您可以使用谓词来代替
=\=/2
。因此,上面的
H1\=H2
将是
dif(H1,H2)
=\=/2
是一个算术运算符,用于比较两个算术表达式的计算结果是否不相等。你用它来表示非数字。请尝试使用
\=
(术语不相同)或
\=
(术语不统一)。@lower为什么不将您的答案作为答案发布,以便关闭问题?有一个标记