gpt4 book ai didi

prolog - 在 Prolog 中将上下文无关文法转换为下推自动机

转载 作者:行者123 更新时间:2023-12-01 15:07:00 25 4
gpt4 key购买 nike

我需要从 DCG 形式的上下文无关文法中获取非确定性下推自动机的增量函数,执行此操作的算法非常简单:


对于语法中的每个规则 A --> B,添加一个转换 [q1, lambda, A] --> [B] 到 delta 函数。

对于语法中的每个规则 E --> c,添加一个转换 [q1, c, c] --> [lambda] 到 delta 函数。

添加转换 [q0, lambda, z0] --> [q1, S*z0][q1, lambda, z0] --> [q2, z0] 到 delta 函数。

每个大写字母都是一个非终结符号,每个小写字母都是一个终结符号。 lambda为空串,S为文法首字母,*为拼接运算符,z0是栈顶的符号。


这意味着语法

S --> A*b | B | y
A --> w*x | x
B --> A*b

用 delta 函数生成下推自动机

[q0, lambda, z0] --> [q1, S*z0]
[q1, lambda, S] --> [q1, A*b]
[q1, lambda, S] --> [q1, B]
[q1, lambda, S] --> [q1, y]
[q1, lambda, A] --> [q1, w*x]
[q1, lambda, A] --> [q1, x]
[q1, lambda, B] --> [q1, A*b]
[q1, b, b] --> [q1, lambda]
[q1, w, w] --> [q1, lambda]
[q1, x, x] --> [q1, lambda]
[q1, y, y] --> [q1, lambda]
[q1, lambda, z0] --> [q2, z0]

我必须在 Prolog 中实现这个算法(从用户那里获取语法并返回 delta 函数),我很困惑,因为这是我第一次使用逻辑编程语言。

我想我也许可以将语法翻译成它的谓词形式,然后“迭代”所有谓词,并以某种方式将已经“遍历”的谓词添加到列表中,这样我就可以处理这个列表并返回 delta 函数。但我认为这是某种非常复杂的命令式做事方式,为此使用 Prolog 是毫无意义的。

也许这个问题有更优雅的解决方案,所以我想知道是否存在这样的解决方案。

最佳答案

这里是一个可能的编码

g2nfa(Grammar, Delta) :-
maplist(transitions, Grammar, DeltaT),
append(DeltaT, DeltaF),
Initial = (q0, lambda, z0 --> q1, 'S'*z0),
Final = (q1, lambda, z0 --> q2, z0),
append([[Initial], DeltaF, [Final]], Delta).

transitions(Sym --> Alternatives, Transitions) :-
phrase(transition(Sym, Alternatives), Transitions).

transition(Sym, A|As) --> state(Sym, A), !, transition(Sym, As).
transition(Sym, A) --> state(Sym, A).
state(Sym, A) --> [(q1, lambda, Sym --> q1, A)].

test :-
g2nfa([( 'S' --> 'A'*b | 'B' | y ),
( 'A' --> w*x | x ),
( 'B' --> 'A'*b )
], T), maplist(writeln, T).

看来可以满足你的要求

?- test.
q0,lambda,z0-->q1,S*z0
q1,lambda,S-->q1,A*b
q1,lambda,S-->q1,B
q1,lambda,S-->q1,y
q1,lambda,A-->q1,w*x
q1,lambda,A-->q1,x
q1,lambda,B-->q1,A*b
q1,lambda,z0-->q2,z0
true.

这样你就可以计算出语法细节。请注意,第二个重写规则(对于语法中的每个规则 E --> c,添加一个转换 [q1, c, c] --> [lambda] 到 delta 函数。)没有已应用于您的 sample 。

关于prolog - 在 Prolog 中将上下文无关文法转换为下推自动机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11060355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com