Array Univ var([x,y] = .. T) - 序言

时间:2017-10-30 21:41:12

标签: prolog

我看到一个问题,询问[a,b,c]=..L.返回什么。 测试时,我看到它返回:L = ['.', a, [b, c]]

我无法理解为什么会发生这种情况,我无法从documentation了解大学的本质。理解这一点将有助于我理解大学。

2 个答案:

答案 0 :(得分:5)

了解有关术语的更多信息的一种方法是在符合Prolog的系统中使用write_canonical/1

例如,使用GNU Prolog,我们获得:

| ?- write_canonical([x,y]).
'.'(x,'.'(y,[]))

这表明:

  1. 此术语中的主要仿函数为'.',其中 arity 2
  2. 第一个参数是x
  3. 第二个参数为'.'(y, []),即列表 [y]
  4. 这解释了为什么(=..)/2会产生:

    | ?- [x,y] =.. Ls.
    
    Ls = ['.',x,[y]]
    

    以及你的另一个例子。

答案 1 :(得分:2)

这是因为prolog中列表的表示是树数据结构,如此。enter image description here它的顶级节点是" dot"如果尾巴不是空的话,那么左侧是头部然后是右侧的一个点,并且在左侧并且是“#34;点”#34;在右手边。当你这样做时,你只是创建一个谓词(好吧,不是一个确切的谓词,但有时需要我展示一个例子):假设我写道:

V=..[somefunctor,X,Y,Z]  

然后它会自动构造一个这样的谓词:

   somefunctor(X,Y,Z).

现在为什么我们需要这个?我想用这些术语调用一个谓词:predicate(somefunctor,term,term2,term3)和谓词或规则看起来像这样:predicate(X,Y,Z,T)我问你无论X中的谓词是什么,你都要用参数调用这个谓词{ {1}}。也许你认为你通过这样的方式调用该谓词:Y,Z,T但不幸的是它在prolog中是不允许的,所以在这里你可以使用V = .. [X,Y,Z,T]其中X应该被放置作为第一个参数,因为它的谓词名称,因此你会得到这样的结果:X(Y,Z,T)这就发生在内部。为了调用这个谓词,你可以使用call predicate:

V = somefunctor(term,term2,term3)