2013-06-05 6 views
2

Поиск по 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

+2

Обратите внимание, что код, который вы отправили, не определяет предикаты, но не терминалы: roman // 1, group // 5 и g3 // 2 (конечно, эти нетерминалы переводятся в предикаты при компиляции и загрузке). –

ответ

1

Ваше понимание кажется мне правильным.

группа // 5 параметризована с

  • А буква группы (от 1 до 3, выраженного g3, как III = 3)
  • B средней точки буква (например, VI = 6)
  • C групповая буква последовательной шкалы, которая будет использоваться при вычитании (например, IX = 9).

тогда группа заданного масштаба может иметь любой из этих пяти шаблонов, задавая числовое значение, которое нужно масштабировать. Как я уже отмечал в оригинальном посте, мне нравится компактность этой грамматики.

+0

Теперь для меня ясно, но у меня все еще есть несколько тупиков :-( Итак, если я понял, предикат g3/3 создает только римские числа I, II, III (1,2,3 в десятичной форме) Так что, относительно предиката группы/5, я считаю, что переменная A, B, C может объединяться с числом чисел C, D, M и значением шкалы, объединяющим 100 мультипликативных факторов для первой группы букв, которая составляла римское число и т. д.: A, B, C объединяются с X, L, C римским номером и шкалой объединяются с 10 для второй группы, которая составляла римское число и в конечном итоге A, B, C объединялась с: I, V, X и Масштаб неравномерно с 1 для третьей группы – AndreaNobili

+0

Если это правда (я надеюсь ...) предикат группы/5 строит каждую группу с телом правила грамматики, используя набор эксклюзивных или: поэтому группа может быть чем-то: g3 (A, T), который мог бы оценивать только I или II или II. Или группа c ould be [A, B], {T = 4}, что означает, что A = I и B = 5 (почему? это не ясно для меня), или может быть [B], g3 (A, F), {T 5 + F} и, следовательно, один ... Я нахожу некоторые трудности для понимания этой части кода ... if нет проблем, потому что вы можете отправить мне пару примеров о том, как будет построен номер, начиная с первого не терминала? tnx так много – AndreaNobili

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

  • Нет связанных вопросов^_^