Недавно я играл с DCG в Прологе, но столкнулся с некоторыми проблемами, касающимися того, как именно это работает. Например, у меня есть такая маленькая грамматика:
<atom> :: <letter> <atom_part> | <letter>
<atom_part> :: <letter> | <digit> | <letter> <atom_part> | <digit> <atom_part>
<letter>:: 'a' | 'b' ... |'Z'
<digit> :: '0' |...|'9'
Что, если я не ошибаюсь, представляет собой любую строку букв или цифр, которая должна начинаться с буквы. Во всяком случае, моя попытка разобрать это следующая:
letter("a") --> "a".
number(X) --> number(X).
...
%etc
programme(I) --> atomm(I).
atomm(C) --> letter(Ch).
atomm(C) --> numb(Ch).
atomm((E)) --> atomm_part(E).
atomm_part(E1,E2) --> atomm(E1),!,atomm(E2).
Здесь я думаю ясно, что последние 2 строчки ошибочны. Это действительно потому, что я не уверен, как сделать «рекурсивный вызов», поэтому синтаксический анализатор снова проверяет, является ли следующий символ в строке числом или строкой. Как я могу это исправить? Заранее спасибо!
кстати, я использую swi-prolog