我看到一个问题,询问[a,b,c]=..L.
返回什么。
测试时,我看到它返回:L = ['.', a, [b, c]]
。
我无法理解为什么会发生这种情况,我无法从documentation了解大学的本质。理解这一点将有助于我理解大学。
答案 0 :(得分:5)
了解有关术语的更多信息的一种方法是在符合Prolog的系统中使用write_canonical/1
。
例如,使用GNU Prolog,我们获得:
| ?- write_canonical([x,y]). '.'(x,'.'(y,[]))
这表明:
'.'
,其中 arity 2 x
'.'(y, [])
,即列表 [y]
这解释了为什么(=..)/2
会产生:
| ?- [x,y] =.. Ls. Ls = ['.',x,[y]]
以及你的另一个例子。
答案 1 :(得分:2)
这是因为prolog中列表的表示是树数据结构,如此。它的顶级节点是" 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)