求两个分数序言之和

Finding sum of two fractions prolog

如何在 Prolog 中计算两个分数的和。让我们用 x+y=z 命名函数 fracsum(X,Y,Z)(x 和 y 分数也给 z 作为分数)。

一些示例:fracsum(1/9,1/9,Z) 结果 Z=2/9fracsum(5/9,1/9,Z) 结果 Z=2/3(也得到最低的分数,而不是 6/9 得到 2/3)。

由于我是 Prolog 的初学者,任何帮助都会很有用。

如果你有 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.

如果您想知道 "but what is a fraction?" 那么您会发现这只是一个术语:

?- 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.

但也许这不是你要问的。