没有完全理解Prolog解析器。为什么这会返回 false 而不是 true?

问题描述 投票:0回答:1

我正在编写一些序言来确定给定的查询是否与语法匹配。

S → F |T N T |ε

F → 如果 B 则 { S } |如果 B 则 { S } 否则 { S }

B → (T E T)

T → x|y|0

E → > | <

N ⇒ +| - | =

现在我写下我的终端和我的规则。对我来说,这似乎应该有效,但事实并非如此。

t(x).
t(y).
t(0).

e(>).
e(<).

n(+).
n(-).
n(=).

% Non Terminals
s([]).
s([T1, N, T2]) :-
    t(T1), n(N), t(T2).
s(S) :-
    f(S).
         
b(['(', T1, E, T2, ')']) :-
    t(T1), e(E), t(T2).


f([if, B, then, '{', S, '}']) :-
    write(B),
    b([B]),
    s(S).

f([if, B, then, '{', S, '}', else, '{', S2, '}']):-
    b([B]),
    s(S),
    s(S2).

parse(E1) :-
    s(E1).

当我尝试用类似的东西测试它时:

?-parse([if, '(', x, '>', y, ')', then, '{', x, '-', y, '}']).

我得到的是假的而不是真的。 有人可以解释一下并指出我正确的方向吗,谢谢!

parsing prolog logic swi-prolog mercury
1个回答
0
投票

将规则转换为 DCG(定句语法)的简单/简单方法:

s --> f.
s --> t, n, t.
s --> [].

f --> [if], b, [then, '{'], s, ['}'].
f --> [if], b, [then, '{'], s, ['}', else, '{'], s, ['}'].

b --> ['('], t, e, t, [')'].

t --> [x] | [y] | [z].

e --> [>] | [<].

n --> [+] | [-] | [=].

注意 DCG 规则定义中使用的是

-->
而不是
:-
。另请注意如何将终端放入规则定义中的显式列表中。

当我加载它并运行你的示例时,我得到:

?- phrase(s, [if, '(', x, '>', y, ')', then, '{', x, '-', y, '}']).
true .

如果你想获得实际的解析树,你必须做的比这更多。

© www.soinside.com 2019 - 2024. All rights reserved.