如何解决=:=运算符的序言实例化错误
| 我正在编写一个名为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)
为什么会这样呢?我的猜测是[]正在=:=上操作,但是如何检查/防止此错误?
解决方法
您在错误的上下文中使用
=:=
和=\\=
。当您手头有两个表达式并要求值和比较它们时,应使用这两个运算符。在您的测试中,由于X
事先未知,因此Prolog无法评估X
并将其与Y
进行比较。有关=:=
和=\\=
的更多信息,请参见:Prolog运算符=:=。
在您的代码中,您只需要统一原子即可,因此一种可能的解决方法是:
subseq([],[]).
subseq([],[_|_]).
subseq([X|Xs],[Y|Ys]) :- X=Y,subseq(Xs,Ys).
subseq([X|Xs],[Y|Ys]) :- X\\=Y,subseq([X|Xs],Ys).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。