【发布时间】:2020-02-26 00:28:25
【问题描述】:
这是来自 Mat 的 answerquestion 的后续问题
从这里开始
e([number(0)] , t1 , Uc0 , Uc0, Bc0 , Bc0) --> [].
e([number(1)] , t2 , Uc0 , Uc0, Bc0 , Bc0) --> [].
e([number(2)] , t3 , Uc0 , Uc0, Bc0 , Bc0) --> [].
e([op(neg),[Arg]] , u1(E) , [_|Uc0], Uc1, Bc0 , Bc1) -->
[_],
e(Arg , E , Uc0, Uc1, Bc0, Bc1).
e([op(ln),[Arg]] , u2(E) , [_|Uc0], Uc1, Bc0 , Bc1) -->
[_],
e(Arg , E , Uc0, Uc1, Bc0, Bc1).
e([op(add),[Left,Right]], b1(E0,E1) , Uc0 , Uc2, [_|Bc0], Bc2) -->
[_,_],
e(Left, E0, Uc0, Uc1, Bc0, Bc1),
e(Right, E1, Uc1, Uc2, Bc1, Bc2).
e([op(sub),[Left,Right]], b2(E0,E1) , Uc0 , Uc2, [_|Bc0], Bc2) -->
[_,_],
e(Left, E0, Uc0, Uc1, Bc0, Bc1),
e(Right, E1, Uc1, Uc2, Bc1, Bc2).
e(U,B,EL,Es) :-
length(UL, U),
length(BL, B),
phrase(e(EL,Es,UL,[],BL,[]), _).
e(N,EL,Es) :-
length([_|Ls], N),
phrase(e(EL,Es,_,[],_,[]),Ls).
e_count(E, Count) :-
length([_|Ls], E),
findall(., phrase(e(_,_,_,[],_,[]), Ls), Sols),
length(Sols, Count).
然后阅读
对于一个变量,使用一个包含一个元素的列表 那个变量。如果您想传递多个变量,请使用 包含 f(...) 形式的单个术语的列表,捕获所有 您想要传递的变量。这也很值得 自己的问题。
演变成这个
e( f([number(0)], t1, Uc0, Uc0, Bc0, Bc0) ) --> [].
e( f([number(1)], t2, Uc0, Uc0, Bc0, Bc0) ) --> [].
e( f([number(2)], t3, Uc0, Uc0, Bc0, Bc0) ) --> [].
e( f([op(neg), [Arg]], u1(E), [_|Uc0], Uc1, Bc0, Bc1) ) -->
[_],
e( f(Arg, E, Uc0, Uc1, Bc0, Bc1) ).
e( f([op(ln) , [Arg]], u2(E), [_|Uc0], Uc1, Bc0, Bc1) ) -->
[_],
e( f(Arg, E, Uc0, Uc1, Bc0, Bc1) ).
e( f([op(add), [Left,Right]], b1(E0,E1) ,Uc0, Uc2, [_|Bc0], Bc2) ) -->
[_,_],
e(f(Left, E0, Uc0, Uc1, Bc0, Bc1) ),
e(f(Right, E1, Uc1, Uc2, Bc1, Bc2) ).
e( f([op(sub), [Left,Right]], b2(E0,E1) ,Uc0, Uc2, [_|Bc0], Bc2) ) -->
[_,_],
e(f(Left, E0, Uc0, Uc1, Bc0, Bc1) ),
e(f(Right, E1, Uc1, Uc2, Bc1, Bc2) ).
e(U,B,EL,Es) :-
length(UL, U),
length(BL, B),
phrase(e(f(EL,Es,UL,[],BL,[])), _).
e_N(N,EL,Es) :-
length([_|Ls], N),
phrase(e(f(EL,Es,_,[],_,[])),Ls).
e_count(E, Count) :-
length([_|Ls], E),
findall(., phrase(e(f(_,_,_,[],_,[])), Ls), Sols),
length(Sols, Count).
哪个有效,但注意到use a list that contains a single term of the form f(...),这里f(...)不在列表中。
我是不是哪里出错了?
补充
参考文献
- Thinking in States 来自 Markus Triska
- Prolog DCG Primer 来自 Markus Triska
- Extra Arguments 与立即学习 Prolog!
隐式状态传递的变量名称约定
通常在使用implict-state-passing时,变量被命名
S0 → S1 →…→ S
但是对于我的一元二叉树示例,我将它们命名为
S0 → S1 →…→ Sn
以Sn 而不是S 结尾。
例如
标准
e(S0,S) :-
这里
e(S0,S2) :-
原因是这个例子有一个相当罕见的属性,即每个 DCG 谓词的长度增加,
例如
e([number(0)] , t1 , Uc0 , Uc0, Bc0 , Bc0) -->
e([op(neg),[Arg]] , u1(E) , [_|Uc0], Uc1, Bc0 , Bc1) -->
e([op(add),[Left,Right]], b1(E0,E1) , Uc0 , Uc2, [_|Bc0], Bc2) -->
所以以xn 结尾让我可以再次检查准确性。
参考:ISO/IEC DTR 13211–3:2006 Definite clause grammar rules
6.1.3 终端序列的变量名约定
此 TR 使用名为 S0、S1、...、S 的变量来表示终端序列 在处理语法规则或扩展时用作参数 语法规则变成从句。在这种表示法中,变量 S0、S1、 ...,S可以看成是一个状态序列,其中S0代表 初始状态和代表最终状态的变量 S。 因此,如果变量 Si 表示给定的终端序列 状态,变量 Si+1 将代表剩余的 用语法规则解析 Si 后的终端序列。
【问题讨论】:
-
觉得标题不太适合这个问题,所以如果您知道更好的标题,请更改它。
-
我不确定我是否理解这个问题。你的意思是写“canonical”而不是“conical”吗?
-
@AndersonGreen 就像我在评论中指出的那样,这是一个糟糕的标题。您确实必须阅读 mat 对链接的上一个问题的回答,然后阅读此处的引用以完全理解这个问题。这更像是一个借口,因此 mat 可以扩展上一个问题,因为上一个问题变得越来越大。
-
@false 我不知道
semicontext notation有一个名字,直到我读了 mat 的答案。然后我在 Markus Triska 的 DCG 文档中找到了它的解释。因为两者都一起使用了Semicontext notation,并强调这是我使用的。我们总是可以创建一个tag synonym。我试图制作一些标签同义词,但似乎需要一些条件才能制作同义词,我相信标签有 5 分,所以我无法制作我想要的。 -
在人类编程语言中,没有 if 表示法,也没有 while-loop 表示法。这只是一个 if 或 if 语句等
标签: implict-state-passing prolog dcg implicit-state-passing dcg-semicontext