我正在尝试使用接受“y | x *”
的状态创建NFA来描述它这是我到目前为止所尝试的:
acpt(State, [A]).
acpt(State, []) :- acpt(State).
acpt(State, InputList) :- InputList = [A],
transition(State, X).
给出输入
acpt(q0, [x,y]).
我正在寻找它返回
true
给出时
acpt(q0, [x,x,y]).
它应该返回
false
我的代码产生了一些错误,我想知道我是否能得到一些帮助。 THX。
答案 0 :(得分:1)
我评论了获得
所需的更正1 ?- acpt(q0, [x,y]).
true
.
2 ?- acpt(q0, [x,x,y]).
false.
工作代码:
% totally useless:
% acpt(State, [A|B]).
% typo: of course, we need acptng/1
% acpt(State, []) :- acpt(State).
acpt(State, []) :- acptng(State).
acpt(State, [A|B]) :-
transition(State, X, A),
acpt(X, B).
现在,除了测试输入工作之外,我必须说我看不到“ε”规则'实现。 IIRC,NFA应该允许在没有消费输入的情况下更改状态。
修改的
追踪
4 ?- leash(-all),trace,acpt(q0, [x,x,x]).
Call: (7) so:acpt(q0, [x, x, x])
Call: (8) so:transition(q0, _G1431, x)
Exit: (8) so:transition(q0, q3, x)
Call: (8) so:acpt(q3, [x, x])
Call: (9) so:transition(q3, _G1431, x)
Exit: (9) so:transition(q3, q3, x)
Call: (9) so:acpt(q3, [x])
Call: (10) so:transition(q3, _G1431, x)
Exit: (10) so:transition(q3, q3, x)
Call: (10) so:acpt(q3, [])
Call: (11) so:acptng(q3)
Exit: (11) so:acptng(q3)
Exit: (10) so:acpt(q3, [])
Exit: (9) so:acpt(q3, [x])
Exit: (8) so:acpt(q3, [x, x])
Exit: (7) so:acpt(q0, [x, x, x])
true
.