PROLOG の割り当てに問題があります。
つまり、単語が言語に属している場合は true (オートマトンは Goto テーブル、アクション テーブル、文法で表されますが、それほど重要ではありません)、そうでない場合は false を返す述語 accept(+Automaton, +Word) を作成する必要があります (必要です)。 true または false を返すように私の割り当てで)。私は書いた
accept(Automaton, Word) :-
parse(Automaton, Word, RightmostDeriv),
nl, print_list(RightmostDeriv), nl.
どこ
述語parse(+Automaton, +Word, -RightmostDeriv)
は最右導出を計算します。Word を解析できない場合RighmostDeriv == ['mistake']
ご覧のとおり、最も正しい派生を出力できますが、false または true を返す方法がわかりません。
このhttps://csc.cdf.toronto.edu/mybb/showthread.php?tid=2100を見つけましたが、ここで問題が発生する可能性があることがわかりました。
しかし、ここに true または false を返すための解決策がありますか (たとえば、 member('mistake', RightmostDeriv) のようなメンバー述語を使用)。
編集:持っている
accept(Automaton, Word) :-
parse(Automaton, Word, RightmostDeriv),
nl, print(RightmostDeriv), nl.
受け取りました (テスト 2 - ウィキペディアの例http://en.wikipedia.org/wiki/LR_parser#Additional_Example_1.2B1 )
[4] ?- make.
=============== Test 1 ===================
[mistake]
=============== Test 2 ===================
[5,3,5,2]
true .
[4] ?-
そして持っている:
accept(Automaton, Word) :-
parse(Automaton, Word, RightmostDeriv),
RightmostDeriv \= ['mistake'].
受け取った (無限ループ)
?- make.
=============== Test 1 ===================
^CAction (h for help) ? break
% Break level 1
[1] ?-