2

在 StackOverflow 上搜索我发现了这个 DCG 语法,它说 inf 字符串是一个罗马数字并将其转换为十进制数字(在这篇文章中:Prolog Roman Numerals (Attribute Grammars)):

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个谓词:

1) group/5有 4 个参数:C, D, M, 100(我认为C , DM代表乘法因子100

那么究竟什么代表H呢?它是代表具有100作为乘法因子的最终小数部分的字母的总和吗?

以同样的方式定义了乘法因子10 (X,L,C) 的group/3谓词版本和乘法因子1 (I,V,X)的 group/3 谓词版本

于是我就这样读了roman/1谓词: ** 一个整数 N 是一个罗马数字,由一组代表乘法因子100的字母组成,后面跟着一组代表乘法因子10的字母,然后是表示乘法因子1的字母组。

并且必须是 TRUE H+T+U 是我的原始十进制数(其中 H+T+U 是代表具有 10 作为乘法因子的最终十进制数的组成部分的字母的总和 + 他代表的字母的总和以 100 作为乘法因子的最终十进制数的分量 + 表示以 1 作为乘法因子的最终十进制数的分量的字母的总和)

是我的推理正确还是我遗漏了什么?

现在,如果我之前的推理是正确的,那么我在理解group/3谓词的工作原理以及g3/2谓词的具体作用方面存在一些问题

你能帮助我吗?

肿瘤坏死因子

安德烈亚

4

1 回答 1

1

你的理解对我来说似乎是正确的。

group//5 参数化为

  • A 组字母(1 到 3,用 g3 表示,如 III = 3)
  • B 中点字母(如 VI = 6)
  • C 连续刻度的组字母,减法时使用(如 IX = 9)。

那么一组给定的刻度可以有这五种模式中的任何一种,给出数值,进行缩放。正如我在原帖中所指出的,我喜欢这种语法的紧凑性。

于 2013-06-05T22:02:49.923 回答