Prolog DCG: преобразование программной нотации в логическую нотацию - PullRequest
0 голосов
/ 07 января 2011

Я пытаюсь конвертировать из этой записи:

A and (B or C) equ A and B or A and C)

в стандартную логическую запись, то есть такие вещи, как and(A,B), or(A,B), neg(A)...

Я подумал, что мне удастся сделать это с помощью DCG (я составил этот вопрос, потому что хочу практиковать DCG) Есть идеи, почему мое преобразование не работает? До сих пор я только что написал дизъюнкцию и случай, когда мы получаем переменную. Ответ, который я хочу, должен быть или (атом (X), атом (Y)).

convert1(atom(X)) --> [X], {var(X)},!.
convert1(or(X,Y)) --> convert1(X), [or], convert1(Y).

test_convert1( F ) :-
   phrase( convert1( F ), [X, or, Y] ).

Ответы [ 2 ]

1 голос
/ 07 января 2011

Синтаксическая ошибка в test_convert1/1. Следует читать

test_convert1(F) :-
    phrase(convert1(F), [X, or, Y]).
1 голос
/ 07 января 2011

Ваш код содержит две ошибки:

  1. В первом предложении вы не читаете X из проанализированного списка.
  2. Сокращения в DCG должны быть вне фигурныхфигурные скобки.

Рабочая версия:

convert1(atom(X)) --> [X], {var(X)}, !.
convert1(or(X,Y)) --> convert1(X), [or], convert1(Y).   
...