在prolog中从头开始定义列表

时间:2017-04-01 19:31:36

标签: list recursion prolog

所以我需要定义一个列表谓词:list(.)如果列表的格式为cons(b,cons(d,cons(e,cons(h,nil)))),则返回true。对于列表bdeh

我还需要定义cons(.,.)二元谓词。

到目前为止,我有:

cons(atom(A),nil):- cons(A,nil).
cons(A,B):- cons(A, cons(B,_)).

list(atom(A)):-cons(A,nil).
list(A):- list(cons(_,A)).

但我认为list(.)谓词实际上并没有贯穿我的缺点。任何人都可以帮忙了解如何遍历列表或继续?

1 个答案:

答案 0 :(得分:0)

  

我还需要定义DispatchQueue.main.async二元谓词。

根据您的问题, cons(.,.)不是谓词,它是一个仿函数。仿函数没有固有的语义。仿函数用于以某种对程序员有意义的结构数据。

您的谓词cons/2需要验证参数是否为列表。列表有两件事:

  • list/1常数;和
  • 仿函数nil/0的复合词,其中第二个元素也是一个列表。

因此我们可以将其定义为:

cons/2

这是如何工作的?第一条只是说明list(nil). list(cons(_,X)) :- list(X). 是一个列表:如果你致电nil它会成功(“返回”list(nil). )。如果你没有给它true,它将检查第二个子句,看看你是否给它nil复合词。如果不是这种情况,则子句(以及谓词调用)将失败。如果是这种情况,它将解包复合词。 Prolog 对第一个元素感兴趣(这就是我们称之为cons/2的原因),我们命名为_的第二个元素,而Prolog将对{{1}执行递归调用用第二个元素检查它是否也是一个列表。因此,它将遍历嵌套的X结构,直到找到list/1(如果第二个元素不是cons/2而不是nil复合词,则会更早切断)