2015-07-07 2 views
3

У меня есть DCG, написанный в прологе, который пытается перевести строку в простую логику высказываний.Запрашивать DCG Prolog для ответа

Действующие правила: + означает OR, * средства и, - значит НЕ

g(or(X,Y)) --> 
    f(X), 
    "+", 
    g(Y). 
g(X) --> 
    f(X). 

f(and(X,Y)) --> 
    e(X), 
    "*", 
    f(Y). 
f(X) --> 
    e(X). 

e(not(X)) --> 
    "-", 
    d(X). 
e(X) --> 
    d(X). 

d(X)--> 
    "(", 
    g(X), 
    ")".  
d(a)--> 
    "a". 
d(b)--> 
    "b". 

Однако у меня возникли проблемы с Out of local trace ошибками.

Этот код должен быть правильным, но как я прошу Пролог дать and(not(or(a,b)),or(b,not(a))) как ответ на -(a+b) * (b + -a)

+1

Вы можете использовать свою грамматику для генерации всех предложений вроде: '? - length (L, N), фраза (g (X), L) .' – false

ответ

0

грамматика кажется, хорошо, но вы забыли обработать/пропустить ЗАГОТОВКИ

?- phrase(g(X), `-(a+b)*(b+-a)`). 
X = and(not(or(a, b)), or(b, not(a))) ; 
false. 

(примечание : Я вручную удалил все пробелы и использовал расширения SWI-Prolog для списка букв.)

+0

? - фраза (g (X), '- (a + b) * (b + -a)'). ОШИБКА: Синтаксическая ошибка: Ожидаемый оператор ОШИБКА: фраза (g (X), '- (a + b) * ( ОШИБКА: ** здесь ** ОШИБКА: b + -a)'). –

+0

Какие расширения вы использовали? –

+0

Я имею в виду обратные элементы вокруг ввода - вы можете видеть их в моем сообщении ... в противном случае используйте '? - atom_codes ('- (a + b) * (b + -a)', Cs), фраза (g (X), Cs) .' – CapelliC

Смежные вопросы