Поиск по StackOverflow я нашел эту грамматику DCG, что говорят, что Inf строка является романский номер и преобразовать его в десятичное число (в этом посте: Prolog Roman Numerals (Attribute Grammars)):Как работает эта грамматика DCG Prolog, которая говорит, что строка является римским номером?
roman(N) -->
group('C','D','M',100, H),
group('X','L','C',10, T),
group('I','V','X',1, U),
{N is H+T+U}.
group(A,B,C, Scale, Value) -->
( g3(A, T)
; [A, B], {T = 4}
; [B], g3(A, F), {T is 5+F} % thanks to Daniel for spotting the bug
; [A, C], {T = 9}
; {T = 0}
), {Value is Scale * T}.
g3(C, 1) --> [C].
g3(C, 2) --> [C,C].
g3(C, 3) --> [C,C,C].
Эта работа хорошо, но я могу Не понимаю, как это работает.
Так что у меня 3 predicatse:
1) группу/5, которые принимают 4 параметра: C, D, М, 100 (где я думать, что С, D и М представляет собой мультипликативный коэффициент .
Так что же представляют собой Н? Является ли это сумма букв, которые представляют собой компонент FINA ldecimal число, имеющее 100 в качестве мультипликативного фактора?
Таким же образом он определяемый версию группы/3 предиката для мультипликативного коэффициента (X, L, С) и вариантом группы/3 предиката для мультипликативного коэффициента (I, V, X)
Так я прочитал римскую/1 предикат следующим образом: ** Целого числа N является романским число, состоящего группой букв, что представляет собой мультипликативный коэффициент , а затем группа букв t шляпа представляет собой мультипликативный фактор , за которым следует группа букв, которая представляет мультипликативный коэффициент .
И должно быть ИСТИННО, что H + T + U - мое исходное десятичное число (где H + T + U - сумма букв, представляющих компонент конечного децимального числа, имеющего 10 в качестве мультипликативного фактора + его сумму буквы, которые представляют собой компонент конечного децимального числа, имеющего 100 в качестве мультипликативного фактора + его сумму букв, которые представляют собой компонент конечного числа, имеющего 1 в качестве мультипликативного фактора)
Является ли это моим аргументом правильным или я что-то упускаю?
Теперь, если мои предыдущие рассуждения правильно, у меня есть некоторые проблемы, чтобы понять, как группа/3 предикат работы и что именно делать g3/2 предикат
Можете ли вы мне помочь?
Tnx
Andrea
Обратите внимание, что код, который вы отправили, не определяет предикаты, но не терминалы: roman // 1, group // 5 и g3 // 2 (конечно, эти нетерминалы переводятся в предикаты при компиляции и загрузке). –