在Prolog中,使用具有不同arities的相同结构是非常罕见的。为了向你展示一个他们可能被使用但不是的地方,考虑它们用于声明谓词动态,多文件或不连续的指令。说,我想声明a/2
和b/5
动态。下列选项ISO-Prolog的是可能的:
:- dynamic(a/2).
:- dynamic(b/5).
:- dynamic([a/2,b/5]). % using a list
:- dynamic((a/2,b/5)). % using an and-sequence
此外,许多Prolog的系统已经宣布dynamic/1
前缀运算符(如实现特有的扩展名),这样你可以写:
:- dynamic a/2.
:- dynamic b/5.
:- dynamic [a/2,b/5].
:- dynamic a/2, b/5.
然而,没有
:- dynamic(a/2,b/5). % does not work
这将符合您的想法。
如果你真的想使用的表示,你将需要(=..)/2
了点。我会说这是许多潜在错误的来源。
我想到的地方与“变量”元数的结构是常用的是组变量简洁表示,因为它们在setof/3
实现中使用的唯一情况。代替使用变量列表Vs
,使用结构V
。
term_varvect(T, V) :-
term_variables(T, Vs),
V =.. ['.'|Vs]. % some use v instead of '.'
在系统与你必须处理溢出情况下,有限的max_arity
:
term_varvect(T, V) :-
term_variables(T, Vs),
catch(V =.. ['.'|Vs],
error(representation_error(max_arity), _),
Vs = V).
这是一门功课,所以我不能由我自己决定如何表述的东西。其实这与我所说的有点不同。我的程序应该认识到所有原子是正则表达式,即is_regexp(X): - atomic(X)。并且对于任意序列,它应该回答'is_regexp(seq(a,b,42,qwe))'这样的查询。所以我认为我必须使用'(= ..)/ 2'这样的东西,即使我的教授从未谈论过它。或者在这种情况下是不同的? – Matteo
Ops,我错了。他们谈论它,并称之为univ – Matteo