2014-11-16 50 views
1

在我的Prolog程序中,我有一個謂詞reg/1,它說如果某個東西是正則表達式。我想讓程序將正則表達式序列識別爲正則表達式。因此,如果reg(a_1),reg(a_2),...,reg(a_n)都是正則表達式,Prolog應該回答是/否回答reg(a_1, a_2, ..., a_n)。 但我不知道該怎麼做。函數不是固定的(Prolog)

我所做的是以下幾點:

reg([H|T]) :- reg(H), reg(T). 
reg([X]) :- reg(X). 

如果,例如,reg(a)reg(b)reg(c)都在知識基礎,然後Prolog的回答是/真到查詢reg([a, b])reg([b, a, c]),但我不能問它像reg(a, b)reg(b, a, c),即我不能擺脫方括號。

回答

3

在Prolog中,使用具有不同arities的相同結構是非常罕見的。爲了向你展示一個他們可能被使用但不是的地方,考慮它們用於聲明謂詞動態,多文件或不連續的指令。說,我想聲明a/2b/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). 
+0

這是一門功課,所以我不能由我自己決定如何表述的東西。其實這與我所說的有點不同。我的程序應該認識到所有原子是正則表達式,即is_regexp(X): - atomic(X)。並且對於任意序列,它應該回答'is_regexp(seq(a,b,42,qwe))'這樣的查詢。所以我認爲我必須使用'(= ..)/ 2'這樣的東西,即使我的教授從未談論過它。或者在這種情況下是不同的? – Matteo

+0

Ops,我錯了。他們談論它,並稱之爲univ – Matteo