我正在写一个名为subseq的函数,它检查一个列表是否是另一个列表的子序列。
subseq([],[]).
subseq([],[Y|Ys]).
subseq([X|Xs],[Y|Ys]) :- X=:=Y, subseq(Xs,Ys).
subseq([X|Xs],[Y|Ys]) :- X=\=Y, subseq([X|Xs],Ys).
当我尝试subseq(X,[1,2])时,我得到:
X = [] ? ;
uncaught exception: error(instantiation_error,(=:=)/2)
为什么会这样?我的猜测是[]正在被=:=操作,但我如何检查/防止此错误?
答案 0 :(得分:3)
您在此处使用错误的上下文中的=:=
和=\=
。当你有两个表达式想要评估和比较它们时,应该使用这两个运算符。在您的测试中,由于事先不知道X
,因此Prolog无法评估X
并与Y
进行比较。有关=:=
和=\=
的更多信息,请访问:Prolog Operator =:=。
在你的代码中你只需要统一原子,所以一个可能的解决办法可能是:
subseq([],[]).
subseq([],[_|_]).
subseq([X|Xs],[Y|Ys]) :- X=Y, subseq(Xs,Ys).
subseq([X|Xs],[Y|Ys]) :- X\=Y, subseq([X|Xs],Ys).