繁体   English   中英

序言谓词返回事实(?)

[英]prolog predicate returns facts(?)

首先,如果我的问题的答案在这里在这里我找不到,所以请不要杀了我。

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

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

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

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

但是如何让“列表”这个词也出现在那里呢? 它到底是什么? 事实? 另一个谓词?

提前致谢!

您可以使用标准的=../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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM