我是Prolog的初學者,我想問一個關於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)
如果(有Ls
是字符串的列表)
accepts(Ls) :- start(A), goesTo(Ls, A, B), final(B).
並假設NFA從狀態硅轉到狀態Sj的和在它們之間有一個狀態Sk的,goesTo
謂詞被定義爲
goesTo(Ls, Si, Sj) :- edge (L, Si, Sk), goesTo(Ls, Sk, Sj).
但是,如果查詢accepts(Ls)
(的任意列表字符串範圍從a
到c
) 教程問題說它幾乎肯定會進入無限搜索併發生堆棧溢出。
但是,我不明白爲什麼查詢將進入無限的搜索並導致堆棧溢出。如果你能給我理由,那將非常棒!
(編輯:)確切的報價是:
「的典型Prolog的用戶可能會希望他/她的goesTo規則是這樣的針鋒相對的查詢接受(X)將產生連續的弦這是上面的NFA所接受的,幾乎可以肯定的是,鑑於給定NFA的上述表示,Prolog系統將進入無限搜索併發生堆棧溢出,請說出爲什麼是這樣(如果您要避免此問題,請說你如何設法避免它)。「
你*的程序是什麼分配*基於N-d F-S *自動*。對? –