如何计算Prolog中两个分数的总和。让我们将函数fracsum(X,Y,Z)
命名为x+y=z
(x和y分数,将z也作为分数)。
一些示例:fracsum(1/9,1/9,Z)
结果Z=2/9
或fracsum(5/9,1/9,Z)
结果Z=2/3
(也获得最低分数,而不是6/9获得2/3)。
由于我是Prolog的初学者,所以任何帮助都会有用。
答案 0 :(得分:5)
如果您有SWI-Prolog,您不必做任何特别的事情,只需使用rdiv
来制作有理数字,如下所示:
?- Z is 1 rdiv 9 + 1 rdiv 9.
Z = 2 rdiv 9.
?- Z is 5 rdiv 9 + 1 rdiv 9.
Z = 2 rdiv 3.
你可能想知道但是如何将1/9
变成1 rdiv 9
但这很容易,这就是你如何制作一个只为一个理性而做的小谓词,就像@lurker已经尝试过的那样在你的问题的评论中解释:
frac_rational(A/B, A rdiv B).
如果你定义了这种关系,那么你就可以从一个分数中得出一个SWI-Prolog:
?- frac_rational(1/9, Rational).
Rational = 1 rdiv 9.
如果你想知道"但是什么是分数?"然后你可以看到它只是一个术语并不特别:
?- write_canonical(1/9).
/(1,9)
true.
但当然/
是运算符,这就是为什么你可以写1/9
而不必总是写/(1,9)
的原因:
?- current_op(Precedence, Type, /).
Precedence = 400,
Type = yfx.
但是但是如果你没有SWI-Prolog,或者出于教学原因你想要自己做理性算术而不是这个还不够,你至少可以弄清楚如何您可以添加具有不同分母的分数以及如何简化分数,这不是一个Prolog问题,而是一个简单的数学问题,出于教学原因,您应该自己回答,然后再询问如何在Prolog中进行。
您的Prolog可能还有CLP(Q)库,那么您可以通过以下方式让您的老师感到惊讶:
?- use_module(library(clpq)).
true.
?- {1/9 + X = 2/3}.
X = 5 rdiv 9.
但也许这不是你要问的。