在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