我正在處理prolog中的作業,該作業掃描數字列表,並應返回列表是否爲有效的羅馬數字和數字的十進制值。例)Prolog羅馬數字(屬性文法)
1 ?- roman(N, ['I'], []).
N = 1
true.
2 ?-
當我跑,我覺得應該工作程序,十進制值永遠是對的,所以我猜我得到的合成屬性部分的權利,但它總是返回數字列表FALSE的時候返回true。我還想補充說,如果存在超過3個Is,Xs或Cs時,它會中止。
1 ?- roman(N, ['I'], []).
N = 1 ;
false.
2 ?- roman(N, ['I','I','I','I'], []).
Error: too many I's
% Execution Aborted
3 ?-
當我拿出N和在{write('N = '), write(N)}
扔,它工作正常,並返回true
。
1 ?- roman(['I'], []).
N = 1
true.
當我刪除{N is ValH + ValT + ValU}
返回true
,但是,它不再顯示十進制值。這裏是我的代碼的頂線(因爲這是當前的任務,我更願意表現出儘可能少的要得到答案):
roman(N) --> hundreds(ValH), tens(ValT), units(ValU), {N is ValH + ValT + ValU}.
爲什麼這回用N假的,但真沒有,我該如何解決?
分配: 以下BNF規範定義羅馬數字 小於1000的語言:
<roman> ::= <hundreds> <tens> <units>
<hundreds> ::= <low hundreds> | CD | D <low hundreds> | CM
<low hundreds> ::= e | <low hundreds> C
<tens> ::= <low tens> | XL | L <low tens> | XC
<low tens> ::= e | <low tens> X
<units> ::= <low units> | IV | V <low units> | IX
<low units> ::= e | <low units> I
此語法定義的屬性來進行兩個任務:
一個)限制<low tens>
中的X的個數,I的<low units>
和 中的C的<low hundreds>
不超過三個。
b)爲<roman>
提供一個屬性,該屬性給出定義的 羅馬數字的十進制值。
定義這些任務所需的任何其他屬性,但不會更改BNF語法的 。
使用短語/ 2'呼叫'DCG文法 – CapelliC 2013-02-15 15:36:18
我認爲你必須支付嚴格關注細節。看[這個答案](http:// stackoverflow。com/a/13269846/874024)爲一個很好的替代方案。 – CapelliC 2013-02-15 15:53:21
我必須嚴格遵守BNF。如果你喜歡,我可以發佈。 – 2013-02-15 16:04:59