![](/img/trans.png)
[英]Prolog facts of lists and a recursion predicate to accept permutations of lists
[英]prolog predicate returns facts(?)
您可以使用标准的=../3
内置谓词创建复合词。 例如:
| ?- Term =.. [list, [1,2,3]].
Term = list([1,2,3])
yes
但请注意,您尝试使用的语法list[elem5, elem6]
无效。 你想模仿数组表示吗? 如果是这样,也许改用list(elem5, elem6)
? 例如:
| ?- Term =.. [list, elem5, elem6].
Term = list(elem5, elem6)
yes
这个
(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).
在Prolog中无效。
[]
表示它是一个列表,因此不能是事实或谓词,这意味着您不能在[
之前放置函子名称。
(A,B,C)
在其他编程语言中称为元组 ,在Prolog中也称为结构。
如果您想在Prolog中的结构中使用多个列表,则可以将其视为
(A,B,C)
其中可以列出A,B和C。
有值的例子
([],[],[])
([a],[b],[c])
([],[a,b,c],[d,e,g])
或针对您的特定情况
([elem1,elem2],[elem3,elem4],[elem5,elem6])
您还可以创建复合词
list(A,B,C)
有值的例子
list([],[],[])
list([a],[b],[c])
list([],[a,b,c],[d,e,g])
list([elem1,elem2],[elem3,elem4],[elem5,elem6])
请记住, 列表实际上是与cons或./2
运算符组合的术语,是语法糖 。 通过在GNU Prolog中使用write_canonical/1
可以看到这一点。
?- write_canonical(([1,2],[3,4],[5,6])).
','('.'(1,'.'(2,[])),','('.'(3,'.'(4,[])),'.'(5,'.'(6,[]))))
要么
?- write_canonical(list([1,2],[3,4],[5,6])).
list('.'(elem1,'.'(elem2,[])),'.'(elem3,'.'(elem4,[])),'.'(elem5,'.'(elem6,[])))
当您尝试将单词list
用作列表[]
的仿函数,例如list[a,b]
您将无法使用,因为列表已经具有仿函数.
。 隐藏了函子的是语法糖.
。 我们中有些人容易记住这一点的原因是,在诸如Lisp之类的语言中,它们仍然使用cons
或者当解析器不知道list的语法糖时,您会很快学习如何使用cons
。
经过OP评论
它应该是[list(elem,elem1),list(elem2,elem3)]
现在您有了一个list []
,其中列表项是list(X,Y)
复合项
那是有效的序言。
write_canonical([list(elem1,elem2),list(elem3,elem4),list(elem5,elem6)]).
'.'(list(elem1,elem2),'.'(list(elem3,elem4),'.'(list(elem5,elem6),[])))
或制作.
操作员脱颖而出
'.'(
list(elem1,elem2),
'.'(
list(elem3,elem4),
'.'(
list(elem5,elem6),
[]
)
)
)
注意每个.
有两个论点。 参数可以是结构或复合结构,例如list(elem1,elem2)
.
有两个参数或空列表[]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.