首先,如果我的问题的答案是here或here 我找不到它,所以请不要杀死我。
我想编写一个Prolog谓词,该谓词返回以下形式的列表:
(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).
现在我可以想到几种返回这种形式的列表的方法:
([elem, elem2], [elem3, elem4],[elem5, elem6]).
但是如何使“列表”一词也出现在这里?什至是什么?事实?另一个谓词?
谢谢!
答案 0 :(得分:0)
您可以使用标准=../3
内置谓词创建复合词。例如:
| ?- Term =.. [list, [1,2,3]].
Term = list([1,2,3])
yes
但是请注意,您尝试使用的语法list[elem5, elem6]
无效。您是否要模仿 array 表示形式?如果是这样,可以改用list(elem5, elem6)
吗?例如:
| ?- Term =.. [list, elem5, elem6].
Term = list(elem5, elem6)
yes
答案 1 :(得分:0)
此
(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).
在Prolog中无效。
[]
表示它是一个列表,因此不能是事实或谓词,这意味着您不能在[
之前放置函子名称。
(A,B,C)
在其他编程语言或Prolog中的结构中称为tuple。
如果您想在Prolog中的结构中使用多个列表,您会认为它是
(A,B,C)
其中A,B和C可以列出。
带有值的示例
([],[],[])
([a],[b],[c])
([],[a,b,c],[d,e,g])
或针对您的具体情况
([elem1,elem2],[elem3,elem4],[elem5,elem6])
您还可以创建一个compound term
list(A,B,C)
带有值的示例
list([],[],[])
list([a],[b],[c])
list([],[a,b,c],[d,e,g])
list([elem1,elem2],[elem3,elem4],[elem5,elem6])
请记住,list实际上是与cons或./2
运算符组合的术语,并且是syntactic sugar。可以通过在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的语法糖时,您很快就会学会如何使用{{ 1}}。
在OP评论之后
应为[list(elem,elem1),list(elem2,elem3)]
现在您有了一个列表cons
,其中列表项是[]
的复合词
那是有效的序言。
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)
或空列表.
。