2015-07-01 79 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