Prolog 定冠词语法(dcg)序言(家庭作业)

Prolog 定冠词语法(dcg)序言(家庭作业),prolog,dcg,Prolog,Dcg,我试图写一个谓词和N={表达式、数字、数字、运算符、变量} 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-->+

我试图写一个谓词和
N={表达式、数字、数字、运算符、变量}

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
我认为我实现了很多部分,但无法实现粗体部分

我的prolog代码,通过程序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).
请帮帮我。

以下可能是您的意思:

:- 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 ...
要获得最简洁易读的答案,请参阅了解更多信息。即下载以下模块:

?- use_module(double_quotes). 要查看DCG是如何实现的,可以对每个非终端说
列出
。例如:

?- 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].
以下可能是您的意思:

:- 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 ...
要获得最简洁易读的答案,请参阅了解更多信息。即下载以下模块:

?- use_module(double_quotes). 要查看DCG是如何实现的,可以对每个非终端说
列出
。例如:

?- 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].

我没有在prolog程序中使用-->的权限。我无法理解如何编写表达式-->(表达式)运算符(表达式)and Number-->prolog程序中的数字。@limonik:谁说您没有权限?或者您使用的是什么prolog?我写下来时,这是我的家庭作业,不幸的是有一些限制,比如-----您应该使用这个还是不使用。---1?--列表(表达式)。表达式(A,A)。表达式(A,B):-数字(A,B)。表达式(A,B):-表达式(A,B),-运算符(A,['('| A]),表达式(A,[')'| B])。表达式(A,C):-运算符(A,[','| B]),表达式(B,C)。表达式(A,C):-变量(A,[','| B]),表达式(B,C)。符合事实的这是一个很好的测试方法。感谢you@limonik:告诉你的老师,最好先使用DCGs来掌握它。我没有在prolog程序中使用-->的权限。我无法理解如何编写表达式-->(表达式)运算符(表达式)and Number-->prolog程序中的数字。@limonik:谁说您没有权限?或者您使用的是什么prolog?我写下来时,这是我的家庭作业,不幸的是有一些限制,比如-----您应该使用这个还是不使用。---1?--列表(表达式)。表达式(A,A)。表达式(A,B):-数字(A,B)。表达式(A,B):-表达式(A,B),-运算符(A,['('| A]),表达式(A,[')'| B])。表达式(A,C):-运算符(A,[','| B]),表达式(B,C)。表达式(A,C):-变量(A,[','| B]),表达式(B,C)。符合事实的这是一个很好的测试方法。感谢you@limonik:告诉你的老师首先使用DCGs更好地掌握它。原始语法描述不完整。您已经定义了变量,但在表达式的定义中没有在任何地方使用。@Lowerer是的,现在我注意到了。但是,在程序定义中不使用变量。老实说,我真的对DCG感到困惑。你有没有看过关于Prolog DCG的在线教程或讨论?它们会很有帮助。例如通过谷歌搜索“DCG Prolog”可以获得很多信息,帮助您理解DCG。原始语法描述不完整。您已经定义了变量,但在表达式的定义中没有在任何地方使用。@Lowerer是的,现在我注意到了。但是,在程序定义中不使用变量。老实说,我真的对DCG感到困惑。你有没有看过关于Prolog DCG的在线教程或讨论?它们会很有帮助。例如通过谷歌搜索“DCG序言”可以获得大量信息,帮助您理解DCG。