序言谓词返回事实(?)

时间:2018-12-03 10:52:53

标签: list prolog

首先,如果我的问题的答案是herehere 我找不到它,所以请不要杀死我。

我想编写一个Prolog谓词,该谓词返回以下形式的列表:

(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).  

现在我可以想到几种返回这种形式的列表的方法:

([elem, elem2], [elem3, elem4],[elem5, elem6]).

但是如何使“列表”一词也出现在这里?什至是什么?事实?另一个谓词?

谢谢!

2 个答案:

答案 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)或空列表.