Парсер RegEx, написанный на Прологе

Я ' Я уже несколько часов бился головой об стену, решая эту домашнюю задачу. Мы должны анализировать регулярное выражение с помощью 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] не соответствует истине для одного из примеров.

8
задан false 25 January 2014 в 21:39
поделиться