gpt4 book ai didi

numbers - 整数与其名称之间的关系 - Prolog

转载 作者:行者123 更新时间:2023-12-02 07:29:36 26 4
gpt4 key购买 nike

我正在尝试探索 Prolog 中的自然数、Peano 数、算术等概念。现在我正在尝试创建一个谓词,允许我输入任何数字的名称并获取它的数值(反之亦然)。我该怎么做?我的想法是我会翻译给定的数字,然后使用加号函数将它们加在一起(例如一百四十五:一,百 = 100,and = 0,四十 = 40,五 = 5 -> 100 + 0 + 40 + 5 = 145。

下面是一些查询的例子:

?- numnames(X, 375).
X = [three, hundred, and, seventy, five] ;
false.
?- numnames([seven], 7).
true ;
false.

以下是我的一些详尽事实(我只是选择了一些可以解决特定类别的事实):

numnames([],0).
numnames(and,0).
numnames([one],1).
numnames([ninety],90).
numnames([one, hundred], 100).

我只是对如何在算术之前翻译数字感到困惑,以及我在哪里/什么时候停止制作详尽的事实并开始制定规则?感谢您的帮助。

最佳答案

这是 Prolog 语法规则DCG 的一个很好的应用程序(基本上是隐藏了一些列表操作的语法糖,并且对普通 Prolog 规则具有相对直接的转换)。

num_0_999(0) --> [zero].
num_0_999(N) --> num_1_99(N).
num_0_999(N) --> num_100_999(N).

num_1_99(N) --> num_1_9(N).
num_1_99(N) --> num_10_19(N).
num_1_99(N) --> decade(T), opt_1_9(U), {N is T+U}.

num_100_999(N) --> num_1_9(H), [hundred], opt_1_99(S), {N is 100*H+S}.

opt_1_9(0) --> [].
opt_1_9(N) --> num_1_9(N).

opt_1_99(0) --> [].
opt_1_99(N) --> [and], num_1_99(N).

num_1_9(1) --> [one]. num_1_9(2) --> [two]. num_1_9(3) --> [three].
num_1_9(4) --> [four]. num_1_9(5) --> [five]. num_1_9(6) --> [six].
num_1_9(7) --> [seven]. num_1_9(8) --> [eight]. num_1_9(9) --> [nine].

num_10_19(10) --> [ten]. num_10_19(11) --> [eleven].
num_10_19(12) --> [twelve]. num_10_19(13) --> [thirteen].
num_10_19(14) --> [fourteen]. num_10_19(15) --> [fifteen].
num_10_19(16) --> [sixteen]. num_10_19(17) --> [seventeen].
num_10_19(18) --> [eighteen]. num_10_19(19) --> [nineteen].

decade(20) --> [twenty]. decade(30) --> [thirty].
decade(40) --> [forty]. decade(50) --> [fifty].
decade(60) --> [sixty]. decade(70) --> [seventy].
decade(80) --> [eighty]. decade(90) --> [ninety].

这是双向的(并且可以枚举所有数字):

?- phrase(num_0_999(46), Name).
Name = [forty, six]
Yes (0.00s cpu, solution 1, maybe more)

?- phrase(num_0_999(N), [forty, six]).
N = 46
Yes (0.00s cpu, solution 1, maybe more)

[我最初使用 #=/2 约束而不是 is/2 来使代码在两种模式下工作,但@CapelliC 的帖子提醒我,通过将算术移动到各自规则的结尾...]

关于numbers - 整数与其名称之间的关系 - Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23299195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com