私は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が状態Siから状態Sjに移行し、その間に状態Skがあると仮定すると、goesTo
述語は次のように定義されます。
goesTo(Ls, Si, Sj) :- edge (L, Si, Sk), goesTo(Ls, Sk, Sj).
しかし、クエリ(からまでaccepts(Ls)
の範囲の文字列の任意のリスト)を実行すると、チュートリアルの質問は、ほぼ確実に無限の検索に入り、スタックオーバーフローが発生することを示しています。a
c
ただし、クエリが無限検索になり、スタックオーバーフローが発生する理由がわかりません。理由を教えていただければ、本当に素晴らしいです!
(編集:)正確な見積もりは次のとおりです。
「典型的なPrologユーザーは、自分のgoesToルールが、クエリaccepts(X)が上記のNFAによって受け入れられる連続した文字列を生成するようなものになることを期待するかもしれません。ほぼ確実に、特定のNFAの上記のプレゼンテーションを考えると、Prologシステムは無限の検索に入り、スタックオーバーフローが発生します。なぜそうなのかを説明してください(この問題を回避するには、どうやって回避したかを説明してください)。」