在序言中列出操作

时间:2019-05-15 15:21:49

标签: list prolog swi-prolog

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

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

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

我希望在第一行X=[1,2,3]之后,第二行X=1Y=[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环境。为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

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].