解析连续的非终端

时间:2016-11-26 02:18:34

标签: context-free-grammar

我知道我应该有mkdir("tmp"),并且第一个T-> UU只解析“parse_U”,第二个aabb只解析最后一个“parse_U {1}}“,但我无法通过追加来弄清楚如何做到这一点。我只能检索以ab开头并以a结尾的子列表,但这不是我想要的结果。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

对于Prolog中的解析,我建议使用DCG(Definite Clause Grammar),如果有的话。

如果我没错,你的语法就会变成

isS --> isT.
isS --> isV.

isT --> isU, isU.

isU --> [a], isU, [b].
isU --> [a, b].

isV --> [a], isV, [b].
isV --> [a], isW, [b].

isW --> [b], isW, [a].
isW --> [b, a].

可以用来调用isS(L, []),其中L是一个包含要解析的序列的列表。

致电

isS([a,a,b,b,a,b], [])

你应该获得真实。

---编辑---

  

这是家庭作业,我们不允许使用" - >"

DGC(使用-->)语法没有什么特别之处;它只是对通常语法的简化。

如果我没错,你可以将上面的DCS语法编写为(警告:在规则名称中添加了不受欢迎的语句)

is_S(Lin, Lout) :- is_T(Lin, Lout).
is_S(Lin, Lout) :- is_V(Lin, Lout).

is_T(Lin, Lout) :- is_U(Lin, Lmid), is_U(Lmid, Lout).

is_U([a | Tin], Lout)      :- is_U(Tin, [b | Lout]).
is_U([a, b | Lout], Lout).

is_V([a | Tin], Lout)      :- is_V(Tin, [b | Lout]).
is_V([a | Tin], Lout)      :- is_W(Tin, [b | Lout]).

is_W([b | Tin], Lout)      :- is_W(Tin, [a | Lout]).
is_W([b, a | Lout], Lout).

调用

is_S([a,a,b,b,a,b], [])

你应该获得真实。