在prolog建设FSA
我被要求在序言中代表FSA。
我们的FSA没有epsilon动作。
如果FSA是非确定性的, nondfsa(FSA)
是正确的。 完成nondfsa。 提示:使用辅助谓词nondstate(State)
,如果State有非确定性转换,则为true。 您可以为谓词添加子句
我给出的答案如下:
nondfsa([Hstate | _ ])
:- nondstate(Hstate).
nondfsa([ _ | Tailstates]) :-
nondfsa(Tailstates).
nondstate(state( _ , Transitions, _ )):-
member(transition(Char, To1), Transitions),
member(transition(Char, To2), Transitions),
not(To1 = To2).
任何人都可以帮我解释一下每个谓词在做什么? 我很困惑这些线路正在转化为什么。
我知道如果至少有一个状态具有多个具有相同字符的转换,那么没有epsilon动作的fsa是非确定性的。 我只是不明白这段代码发生了什么。
所提供的代码非常简单,学会“通读”一个Prolog谓词是一件好事。
nondfsa([Hstate | _ ]) :-
nondstate(Hstate).
nondfsa([ _ | Tailstates]) :-
nondfsa(Tailstates).
这是一个非常普通的Prolog模式,递归检查列表中的每个元素。 nondfsa/1
检查列表中的每个元素。 如果它们中的任何一个是非确定性状态(根据nondstate/1
),则nondfsa/1
成功,这意味着FSA是非确定性的。 如果nondstate/1
对于给定列表中的任何元素都不成功,则nondfsa/1
将失败。 第一个条款检查列表的头部。 第二个条款跳过头部并检查列表的其余部分。 在递归调用中,Prolog再次从第一个子句开始,所以它只是通过nondstate/1
检查下一个元素。
nondstate(state( _ , Transitions, _ )):-
member(transition(Char, To1), Transitions),
member(transition(Char, To2), Transitions),
not(To1 = To2).
如果发现给定state/3
根据仅取决于该状态的转换的某个定义是非确定性的,则nondstate/1
成功。 如果你通读了你的nondstate/1
谓词nondstate/1
谓词,你可以看到它是什么。 谓词成功,如果:
换句话说,如果有一个角色已经转换到至少两个不同的状态,那么状态是非确定性的。
链接地址: http://www.djcxy.com/p/66941.html