使用=:=运算符进行prolog实例化错误

时间:2011-05-31 23:50:19

标签: prolog

我正在写一个名为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)

为什么会这样?我的猜测是[]正在被=:=操作,但我如何检查/防止此错误?

1 个答案:

答案 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).