Prolog DCG возвращает форум вместо значения

Я пытаюсь научиться использовать DCG и столкнулся с проблемой, когда возвращаемое значение, которое я получаю, представляет собой формулу, а не сумму формулы, например, A = 1+3*20 вместо A = 61. . Что я делаю не так? Я пытался ввести dansk(A) --> en2ni(A1), [og], tyve2halvfems(A2), A is A1+A2., но потом получаю сообщение об ошибке

ERROR: dansk/3: Undefined procedure: (is)/4
ERROR:     However, there are definitions for:
ERROR:         system:is/2

Любые идеи, что я делаю неправильно?

dansk(A) --> nul(A).
dansk(A) --> en2ni(A).
dansk(A) --> ti2nitten(A).
dansk(A1+A2) --> en2ni(A1), [og], tyve2halvfems(A2).
dansk(A) --> tyve2halvfems(A).

nul(0) --> [nul].

en2ni(1) --> [en].
en2ni(1) --> [et].
en2ni(2) --> [to].
en2ni(3) --> [tre].
en2ni(4) --> [fire].
en2ni(5) --> [fem].
en2ni(6) --> [seks].
en2ni(7) --> [syv].
en2ni(8) --> [otte].
en2ni(9) --> [ni].

ti2nitten(10) --> [ti].
ti2nitten(11) --> [ellve].
ti2nitten(12) --> [tolv].
ti2nitten(13) --> [tretten].
ti2nitten(14) --> [fjorten].
ti2nitten(15) --> [femten].
ti2nitten(16) --> [seksten].
ti2nitten(17) --> [sytten].
ti2nitten(18) --> [atten].
ti2nitten(19) --> [nitten].

tyve2halvfems(20) --> [tyve].
tyve2halvfems(30) --> [tredive].
tyve2halvfems(40) --> [fyrre].
tyve2halvfems(50) --> [fyrretyve].
tyve2halvfems(A1*A2) --> [halv], halvmult(A1), emfas(A2).
tyve2halvfems(A1*A2) --> mult(A1), emfas(A2).

mult(3) --> [tres].
mult(4) --> [firs].
mult(4) --> [fjerds].

halvmult(A-0.5) --> mult(A).
halvmult(4.5) --> [fems].

emfas(20) --> [sindstyve].
emfas(20) --> [].

person user2319925    schedule 29.11.2013    source источник
comment
Для начала поместите фигурные скобки вокруг A is A1+A2. Таким образом {A is A1+A2}. (is)/2 — это встроенный предикат, а не нетерминал.   -  person false    schedule 30.11.2013
comment
Спасибо, это сработало. Итак, вам всегда нужны фигурные скобки, когда это не нетерминал?   -  person user2319925    schedule 30.11.2013
comment
{}/1 это ваш выход на Пролог.   -  person false    schedule 30.11.2013


Ответы (1)


ваш DCG строит синтаксическое дерево выражения. Вы можете вызвать is/2 на нем.

?- phrase(dansk(X), [tre,og,fyrre]), Y is X.
X = 3+40,
Y = 43 ;
false.

(примечание: я понятия не имею, что означает «tre,og,fyrre» :)

person CapelliC    schedule 30.11.2013
comment
Программа должна считать на датском языке. Таким образом, tre og fyrre означает три и сорок, что равно 43. В Дании считают с основанием 20, поэтому, когда нам нужны числа вроде 90, получается половина женщин = (5-0,5)*20. И спасибо, что рассказали мне, как я могу вызвать это с помощью /2. :) - person user2319925; 01.12.2013
comment
@ user2319925: это сложнее, чем французский, где 80 - это quatre vingt (4 * 20). Может быть, мне стоит научиться пользоваться пальцами ног :) - person CapelliC; 01.12.2013