私はこの宿題の問題で数時間頭を壁にぶつけていました。Prolog で正規表現を解析する必要があります。ほとんどの場合、私が持っている述語は機能しますが、いくつかの正規表現と文字列の組み合わせにより、SWI-Prolog のスタック スペースが不足してしまいます。2 つの Regex 文字列の組み合わせのサンプルを次に示します。1 つは機能し、もう 1 つは機能しません。
star(star(char(a))), []
star(star(char(a))), [a]
最初のものは機能し、2 つ目はスタックを使い果たします。
私が使用している述語は次のとおりです。
re_match(epsilon, []).
re_match(char(Letter), [Letter]).
re_match(star(_), []).
re_match(seq(Rx1, Rx2), List) :- append(List1, List2, List), re_match(Rx2, List2), re_match(Rx1, List1).
re_match(alt(Rx1, Rx2), List) :- re_match(Rx1, List); re_match(Rx2, List).
re_match(star(Rx), List) :- append(List1, List2, List), re_match(Rx, List1), re_match(star(Rx), List2).
正しく機能させるためにどのような変更を加える必要があるのか わかりませんが、他に何をすべきかわかりません。
また、List :- append(List1, List2, List) を [H|T] に変更しても、例の 1 つで true と評価されません。