【问题标题】:prolog instantiation error with =:= operator带有 =:= 运算符的 prolog 实例化错误
【发布时间】:2011-09-05 21:26:04
【问题描述】:

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

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

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您在这里使用了错误的上下文=:==\=。当您手头有两个表达式并想要评估和比较它们时,应该使用这两个运算符。在您的测试中,由于事先不知道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).
    

    【讨论】:

    • 许多 Prolog 系统都提供了 dif/2,您可以使用它来代替 (\=)/2。不过,我不会将此谓词称为 subseq/2。
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多