2015-07-01 106 views
1

我試圖寫一個謂語和N={Expression,Number,Digit,Operator,Variable}明確子句語法(DCG)的Prolog(作業)

T={1,2,3,+,-,*,(,),X,Y,Z}和S是表達和程序P定義爲

Expression-->Number 
**Expression-->(Expression) Operator (Expression)** 
Number-->Digit 
**Number --> Digit Number** 
Digit-->1 
Digit-->2 
Digit-->3 
Operator-->+ 
Operator-->- 
Operator-->* 
Variable-->X 
Variable-->Y 
Variable-->Z 

我認爲然而,我實現許多份無法實現大膽的部分!

,通過根據程序P描述端子我序言代碼:

expression(S,S). 
    expression(S,R):-number(S,R). 
    expression(S,R):-expression(S,R),-operator(S,['('|S]),expression(S,[')'|R]). 
    expression(S,R):-operator(S,[','|S1]),expression(S1,R). 
    expression(S,R):-variable(S,[','|S1]),expression(S1,R). 
    number(S,R):-digit(S,R). 
    digit(['1'|R],R). 
    digit(['2'|R],R). 
    digit(['3'|R],R). 
    operator(['+'|R],R). 
    operator(['-'|R],R). 
    operator(['*'|R],R). 
    variable(['X'|R],R). 
    variable(['Y'|R],R). 
    variable(['Z'|R],R). 

請幫助我。

+0

原始文法描述不完整。您定義了變量但未在表達式的定義中使用。 – lurker

+0

@lurker是的,現在我注意到它。但是在程序定義中不使用變量。老實說,我很困惑dcg – limonik

+1

您是否閱讀過有關Prolog DCG的在線教程或討論?他們可以很有幫助。例如,[教程 - 在SWI-Prolog中使用確定子句語法](http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB8QFjAA&url=http% 3A%2F%2Fwww.pathwayslms.com%2Fswipltuts%2Fdcg%2F&EI = XS6VVZLDGIy-ggTFhI3oDw&USG = AFQjCNE511aVfbhO5EBEJx2s5az0bKewcQ&BVM = bv.96952980,d.eXY)。谷歌搜索「DCG Prolog」會產生很多信息,可以幫助您瞭解DCG。 – lurker

回答

4

這裏可能是你的意思是:

:- set_prolog_flag(double_quotes, chars). 

expression --> number. 
expression --> variable. 
expression --> "(", expression, operator, expression, ")". 

number --> digit. 
number --> digit, number. 

digit --> "1". 
digit --> "2". 
digit --> "3". 

operator --> "+"|"-"|"*". % more compact notation 
variable --> "X"|"Y"|"Z". 

使用它像這樣產生的長下令所有的句子:

?- length(L, N), phrase(expression, L). 
L = ['1'], 
N = 1 ; 
L = ['2'], 
N = 1 ; 
L = ['3'], 
N = 1 ; 
L = ['X'], 
N = 1 ; 
L = ['Y'], 
N = 1 ; 
L = ['Z'], 
N = 1 ; 
L = ['1', '1'], 
N = 2 ; 
L = ['1', '2'], 
N = 2 ... 

而且獲得最緊湊和可讀的答案見this更多。也就是說,下載下面的模塊:

?- use_module(double_quotes).
?- length(L, N), phrase(expression, L). 
L = "1", 
N = 1 ; 
L = "2", 
N = 1 ; 
L = "3", 
N = 1 ; 
L = "X", 
N = 1 ; 
L = "Y", 
N = 1 ; 
L = "Z", 
N = 1 ; 
L = "11", 
N = 2 ; 
L = "12", 
N = 2 

要查看DCG是如何實現的,說listing對每個非終端。例如:

?- listing(expression). 
expression(A, B) :- 
     number(A, B). 
expression(A, B) :- 
     variable(A, B). 
expression(['('|A], E) :- 
     expression(A, B), 
     operator(B, C), 
     expression(C, D), 
     D=[')'|E]. 
+0

我沒有權限在我的prolog程序中使用 - >。我無法理解我如何在prolog程序中編寫表達式 - >(表達式)運算符(表達式)和編號 - >數字編號。 – limonik

+1

@limonik:**誰說你沒有權限 - 或者你在用什麼Prolog? – false

+0

正如我寫下它是我的家庭作業,不幸的是有一些限制,如---你應該使用這個或不使用.---- – limonik