在 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 , D和M代表乘法因子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谓词的具体作用方面存在一些问题
你能帮助我吗?
肿瘤坏死因子
安德烈亚