Я уже несколько часов бьюсь головой об стену по этой задаче. Мы должны разобрать регулярное выражение с Прологом. По большей части предикаты у меня работают, но есть несколько регулярных выражений и строковых комбинаций, которые заставляют их исчерпывать пространство стека в 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: - добавление (List1, List2, List) к [H | T] не оценивается как true для одного из примеров.