次の文法がある場合:
S → ε
S → a S b S
Prologに実装するにはどうすればよいですか?
私はこれを試しました:
isMatched([]).
isMatched([a,b]).
isMatched([a|[S1|[b|S2]]]) :- isMatched(S1), isMatched(S2).
ただし、リストの先頭をリストにすることはできないため、明らかに機能しません。
次に、次のように新しいバージョンを実装してみました。
conc([], R, R).
conc([H|T], L, [H|R]) :- conc(T, L, R).
isMatched([]).
isMatched([a,b]).
isMatched(List) :- conc([a], S1, List3), isMatched(S1), conc(List3, [b], List2), conc(List2, S2, List), isMatched(S2).
ただし、入力isMatched([a,b,a])
の場合、スタックが不足します。
これを修正するにはどうすればよいですか?