【问题标题】:Prolog DCG is returning a forumla instead of a valueProlog DCG 正在返回一个公式而不是一个值
【发布时间】:2013-11-29 22:40:04
【问题描述】:

我正在尝试学习如何使用 DCG,但当我得到的返回值是公式而不是公式的总和时遇到了问题,例如 A = 1+3*20 而不是A = 61. 我做错了什么?我尝试输入dansk(A) --> en2ni(A1), [og], tyve2halvfems(A2), A is A1+A2.,但随后出现错误

ERROR: dansk/3: Undefined procedure: (is)/4
ERROR:     However, there are definitions for:
ERROR:         system:is/2

任何想法我做错了什么?

dansk(A) --> nul(A).
dansk(A) --> en2ni(A).
dansk(A) --> ti2nitten(A).
dansk(A1+A2) --> en2ni(A1), [og], tyve2halvfems(A2).
dansk(A) --> tyve2halvfems(A).

nul(0) --> [nul].

en2ni(1) --> [en].
en2ni(1) --> [et].
en2ni(2) --> [to].
en2ni(3) --> [tre].
en2ni(4) --> [fire].
en2ni(5) --> [fem].
en2ni(6) --> [seks].
en2ni(7) --> [syv].
en2ni(8) --> [otte].
en2ni(9) --> [ni].

ti2nitten(10) --> [ti].
ti2nitten(11) --> [ellve].
ti2nitten(12) --> [tolv].
ti2nitten(13) --> [tretten].
ti2nitten(14) --> [fjorten].
ti2nitten(15) --> [femten].
ti2nitten(16) --> [seksten].
ti2nitten(17) --> [sytten].
ti2nitten(18) --> [atten].
ti2nitten(19) --> [nitten].

tyve2halvfems(20) --> [tyve].
tyve2halvfems(30) --> [tredive].
tyve2halvfems(40) --> [fyrre].
tyve2halvfems(50) --> [fyrretyve].
tyve2halvfems(A1*A2) --> [halv], halvmult(A1), emfas(A2).
tyve2halvfems(A1*A2) --> mult(A1), emfas(A2).

mult(3) --> [tres].
mult(4) --> [firs].
mult(4) --> [fjerds].

halvmult(A-0.5) --> mult(A).
halvmult(4.5) --> [fems].

emfas(20) --> [sindstyve].
emfas(20) --> [].

【问题讨论】:

  • A is A1+A2 周围加上花括号开始。因此{A is A1+A2}(is)/2 是内置谓词,而不是非终结符。
  • 谢谢,它成功了。所以当它不是非终端时,你总是需要花括号?
  • {}/1 是你对 Prolog 的逃避。

标签: prolog dcg


【解决方案1】:

您的 DCG 构建表达式语法树。你可以调用 is/2 就可以了。

?- phrase(dansk(X), [tre,og,fyrre]), Y is X.
X = 3+40,
Y = 43 ;
false.

(注意:我不知道 'tre,og,fyrre' 是什么意思 :)

【讨论】:

  • 该程序应该以丹麦语计算。所以“tre og fyrre”的意思是 3 和 40 等于 43。在丹麦,它们以 20 为底数,所以当我们想要像 90 这样的数字时,它的“halv fems” = (5-0.5)*20。感谢您告诉我如何使用 /2 来调用它。 :)
  • @user2319925:它比法语更复杂,其中 80 是 quatre vingt (4*20)。也许我应该学会用我的脚手指:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多