我是 Prolog 的初学者,我想问一个关于 Prolog 的问题。
我的程序基于非确定性有限状态自动机。
起始状态为S0,最终状态为S3。
图是
所以如果有一个字符串[a,a,b,b,c,c]
它应该像
start(s0).
edge(a, s0, s0).
edge(a, s0, s1).
edge(b, s1, s1).
edge(b, s1, s2).
edge(c, s2, s2).
edge(c, s2, s3).
final(s3).
有一个谓词accepts(Ls)
if(有Ls
一个字符串列表)
accepts(Ls) :- start(A), goesTo(Ls, A, B), final(B).
并假设 NFA 从状态Si到状态Sj并且在它们之间存在状态Sk,goesTo
谓词定义为
goesTo(Ls, Si, Sj) :- edge (L, Si, Sk), goesTo(Ls, Sk, Sj).
但是,如果查询(从到的accepts(Ls)
任意字符串列表),教程问题说它几乎肯定会进入无限搜索并且会发生堆栈溢出。a
c
但是,我不明白为什么查询会进入无限搜索并导致堆栈溢出。如果你能给我一个理由,那就太好了!
(编辑:)确切的报价是:
“一个典型的 Prolog 用户可能希望他/她的 goTo 规则是这样的,即查询接受(X)会生成被上述 NFA 接受的连续字符串。几乎可以肯定,鉴于给定 NFA 的上述表示,Prolog 系统将进入无限搜索并发生堆栈溢出。说明为什么会这样。(如果您要避免此问题,请说明您如何设法避免它)。