首页 > 解决方案 > 在 prolog 中列出操作

问题描述

我刚开始学习序言,所以这些可能是新手问题。我的问题是这个。使用这两条代码我得到错误:

X = .(1,.(2,.(3,[]))).

.(X,Y) = [1,2,3].

我希望在第一行X=[1,2,3]之后和第二行之后X=1and Y=[2,3]

相反,我得到了这个错误:

ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:   [11] throw(error(instantiation_error,_3540))
ERROR:    [9] '$dicts':'.'(_3570,_3572,_3574) at c:/program files/swipl/boot/dicts.pl:46
ERROR:    [8] '<meta-call>'(user:(...,...)) <foreign>
ERROR:    [7] <user>
ERROR: 
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.

我正在为 Windows 10 使用 SWI-Prolog 环境。为什么会发生这种情况?

标签: listprologswi-prolog

解决方案


SWI-Prolog 对列表做了一些不同的事情。而不是.它使用'[|]'. 因此,以您的第一个示例为例:

?- X = .(1, .(2, .(3, []))).

并将每个替换.(A, B)'[|]'(A, B)

?- X = '[|]'(1,'[|]'(2,'[|]'(3,[]))).
X = [1, 2, 3].

另一个变成:

?- '[|]'(X, Y) = [1, 2, 3].
X = 1,
Y = [2, 3].

推荐阅读