Как вы переводите DCG в обычные определенные предложения в PROLOG? - PullRequest
3 голосов
/ 04 декабря 2011

Как бы вы перевели следующие DCG в обычные определенные пункты PROLOG?

expr_regular --> cor_ini,numero,guion,numero,cor_fin.
cor_ini --> ['['].
numero --> ['0'];['1'];['2'];['3'];['4'];['5'];['6'];['7'];['8'];['9'].
cor_fin --> [']'].
guion --> ['-'].

РЕДАКТИРОВАТЬ: Я хочу перевести DCG в обычные предложения PROLOG, потому что я не могу использовать и DCG, и обычные предложения в одном и том же коде (в моем случае). У меня есть две части кода:

Piece1:

traducir(Xs, Ys) :- maplist(traduccion, Xs, Ys).
traduccion('^',comeza_por).
traduccion('[',inicio_rango).
traduccion('0',cero).
traduccion('-',a).
traduccion('9',nove).
traduccion(']',fin_rango).

Пример того, как его использовать:

?- traducir(['[','0','-','9',']'],[]).
true .

И Часть2:

 traducir--> cor_ini,numero,guion,numero,cor_fin.
 cor_ini --> ['['].
 numero --> ['0'];['1'];['2'];['3'];['4'];['5'];['6'];['7'];['8'];['9'].
 cor_fin --> [']'].
 guion --> ['-'].

Пример того, как его использовать:

traducir(['^','[','0','-','9',']'],X).
X = [comeza_por, inicio_rango, cero, a, nove, fin_rango].

Я хочу объединить оба кода в один, чтобы проверить, хорошо ли написан traducir (если он соответствует DCG), и перевести то, что вы вводите в текст, поэтому итоговая программа должна выполнить следующее:

?- traducir(['^','[','0','-','9',']'],X).
X = [comeza_por, inicio_rango, cero, a, nove, fin_rango].
?- traducir(['[','0','-','9',']'],[]).
true .

Ответы [ 3 ]

2 голосов
/ 26 июня 2015

В SWI-Prolog вы можете использовать listing/1 непосредственно на :

?- forall(member(NT,[expr_regular//0,cor_ini//0,numero//0,cor_fin//0,guion//0]),
          listing(NT)).
expr_regular(A, F) :-
    cor_ini(A, B),
    numero(B, C),
    guion(C, D),
    numero(D, E),
    cor_fin(E, F).

cor_ini(['['|A], A).

numero(A, B) :-
    (   A=['0'|B]
    ;   A=['1'|B]
    ;   A=['2'|B]
    ;   A=['3'|B]
    ;   A=['4'|B]
    ;   A=['5'|B]
    ;   A=['6'|B]
    ;   A=['7'|B]
    ;   A=['8'|B]
    ;   A=['9'|B]
    ).

cor_fin([']'|A], A).

guion([-|A], A).

true.

Вот и все! Вы можете получить выгоду, посмотрев на ответы на соответствующий вопрос " Есть ли способ или алгоритм для преобразования DCG в обычные определенные предложения в Прологе? ".

1 голос
/ 05 декабря 2011

Ваша грамматика исключительно проста: просто терминалы.Таким образом, мы можем перевести на очень специфический шаблон (будьте осторожны: обобщение не допускается).

expr_regular(S, G) :-
    S = [0'[, N1, 0'-, N2, 0']|G], numero(N1), numero(N2).
numero(N) :-
    memberchk(N, "0123456789").

Единственное, на что стоит обратить внимание, это стандартная символьная нотация ISO ...

1 голос
/ 04 декабря 2011

Ну, я действительно не понимаю ваш вопрос. В любом случае, если вы по какой-то причине не хотите использовать красивый синтаксис DCG, вы все равно можете пойти с такими вещами, как wildcard_match/2, или заново изобрести колесо и самостоятельно использовать списки различий, чтобы заново реализовать DCG или добавить. Для wildcard_match/2 части:

expr_regular(R) :- wildcard_match('[[][0-9]-[0-9]]', R).
...