Я ' Я уже несколько часов бился головой об стену, решая эту домашнюю задачу. Мы должны анализировать регулярное выражение с помощью Prolog. По большей части, предикаты у меня работают, но есть несколько регулярных выражений и строковых комбинаций, из-за которых у них заканчивается пространство стека в SWI-Prolog. Вот пример с двумя комбинациями строк Regex, одна работает, а другая нет:
star(star(char(a))), []
star(star(char(a))), [a]
Первая работает, а вторая исчерпывает стек.
Вот предикаты, которые я использую:
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] не соответствует истине для одного из примеров.