Prolog非齐次列表

Prolog非齐次列表,prolog,Prolog,有没有办法在prolog中编写非同质列表? 我想创建一个包含符号和整数的列表。比如: [a23bde] 谢谢 是的,Prolog中没有类型。您必须用引号书写大写字母: [A',2,3',B',C''D',E',f,g]Prolog只有一种数据类型,因此每个列表都是同质的 Prolog中的每个元素都只是一个术语a是一个术语,a(x,y)是一个术语,3是一个术语,语言中没有任何东西可以区分它们。当然,很多内置谓词是根据类型进行区分的——你不能指望X是1+a——但是语言本身没有区别 因此,为了回答您的

有没有办法在prolog中编写非同质列表?
我想创建一个包含符号和整数的列表。比如:
[a23bde]

谢谢


是的,Prolog中没有类型。您必须用引号书写大写字母:
[A',2,3',B',C''D',E',f,g]

Prolog只有一种数据类型,因此每个列表都是同质的

Prolog中的每个元素都只是一个术语
a
是一个术语,
a(x,y)
是一个术语,
3
是一个术语,语言中没有任何东西可以区分它们。当然,很多内置谓词是根据类型进行区分的——你不能指望
X是1+a
——但是语言本身没有区别

因此,为了回答您的问题,您可以将您想要的任何内容完全放在列表中,包括以上所有内容-以下是有效的序言:

L = [a, a(x,y), 3, X is 1 + a].

Turbo Prolog要求列表元素为单一类型。但是有一种方法可以解决这个问题——您只需要定义一个可以同时表示整数和符号的类型。您可以通过定义一个复合域来实现这一点,在该域中,每个不同的类型都用不同的函子包装。例如:

mixed_type = i(integer); s(symbol).
mixed_list = mixed_type*.
缺点是在每个列表元素周围都需要一个函子,这有点尴尬:

[s(a), i(2), i(3), s(b), s(c)]

好的,但是我如何将它定义为域呢?因为当我尝试将符号与整数混合时,它会给我:“类型错误:错误的对象类型”@AdiUlici你能提供一些上下文吗?听起来是阅读列表抱怨类型,而不是Prolog本身。如果我想创建一个整数列表,我会创建一个域
list=integer*
,但是如果我想创建一个包含整数和符号的列表,我该写些什么呢?我忘了提到,我用的是一个旧的序言:Turbo prolog 2.0谢谢,@Nick,这正是我需要的!祝你今天愉快@当然,有很多内置谓词都有类型的概念,但它们是库的一部分,而不是语言的一部分。在纯Prolog中,我认为“操作”的可能只有规则查找和术语统一。