问题标签 [successor-arithmetics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - Prolog 在要求另一种解决方案时获得无限循环
我正在使用 SWI Prolog,我的作业中使用了以下代码(该代码不是作业,但需要编写课程所需的方法):
exp(a,b,c)
意味着c=b^a
。
它直接从书中复制:“Prolog的艺术:高级编程技术”。
当我运行以下查询时:
我得到一个答案:
但是当我通过输入要求另一个答案时;
我得到一个无限循环(以堆栈外错误结束),我希望得到错误。
代码中的问题是什么?是否有相同的代码(具有相同的自然数表示)但行为方式与我描述的方式相同?如果是这样,一些指示或建议会很有帮助。
提前致谢。
prolog - 用另一种方法将两个整数相除
让我们考虑 n=s(s(...s(0)...)) (简单地说 n= s^n(0))。如何编写一个计算两个整数相除的程序?我的意思是 s^(n//m) (这是除法的定义)。有任何想法吗?例如,如果我们有一个问题:
我写了以下代码:
prolog - 序言中的二分法
我写了以下代码:
一切都到这里为止。但是我应该写什么来计算另外两个自然数的除法?例如
prolog - Prolog,检查Peano算术中的可分性
我需要检查第一个给定的术语(例如s(s(nul))
(或 2))是否可以被第二个术语(例如s(nul)
(或 1))整除。
我想要做的是将给定术语乘以二,然后检查该术语是否小于或等于另一个术语(如果相等 - 问题已解决)。
到目前为止,我得到了这个:
我似乎无法弄清楚如何将一个术语乘以 2。有什么想法吗?
prolog - 自然数(1)-> 假。s/1 谓词的问题
我正在使用 swi-prolog。我只是试图遵循“序言的艺术”一书中的例子,但我没有得到正确的结果。恐怕这可能是由于 s/1 谓词。我什至在 swipl 的文档中都找不到 s/1,唯一类似的谓词是 succ/2:http ://www.swi-prolog.org/pldoc/man?predicate=succ/2这可以t 的使用方式与 s/1 相同。我更喜欢使用 s 谓词。
这是判断一个数是否为自然数的程序:
但是, natural_number(1) 例如产生错误。这里有什么问题?
prolog - Prolog - 一些基本的算术运算实现
我是 Prolog 的新手,需要在不使用内置谓词的情况下对自然数实现一些基本的算术运算。
我用一元表示法表示自然数 Term,这意味着我有常数 0 和递归后继仿函数s [即 4 = s(s(s(s(0))))]。关于上述符号,我实现了算术运算。
规则集是:
现在,当我查询时:
我一切正常:
RES = s(s(s(s(s(s(0))))))。
当我查询时:(想问6/3=?)
我陷入了无限循环并得到了如此
即使我更改了 mult 谓词中递归调用的顺序,它也无济于事:
我在 linux 机器上运行 swi-prolog。
将感谢您的建议!
prolog - 除了两个输入之外,我如何使用后继功能?
这是两个输入的加法代码(就像我们想要 Z 中的结果,如果 X+1 加 Y 有 Z+1 的结果)。
但我想知道我们可以将类似的代码用于 3 个组件,例如
先感谢您。
prolog - 具有后继算术的权力 - 如何防止无限循环?[序言]
我整天都在想这个。我终于承认,我对 Prolog 的理解并没有我想象的那么好。
在一天开始的时候,我在实现一个后继算法时遇到了麻烦,它乘以 2 个 s 数,它的结构是这样的:
我的第一次尝试是这样的:
这有效,但查询mul(X,Y,s(0))
以无限循环结束。为什么?我已阅读以下帖子:Prolog 后继符号产生不完整的结果和无限循环
我从中了解到:如果我在调用 add 之前调用 mul,并且我在 mul/3 谓词中有变量,这些变量在两个 mul/3 调用中都没有使用,Prolog 会尝试为它未绑定的变量寻找新的可能性。因此它进入了一个无限循环。
为了解决这个问题,我先调用了add:
做到了。然后我尝试实现幂函数,并想“嗯,现在很容易,第一次尝试是:
但是,我必须把 mul 放在第一位,以防止 R 和 Tmp 的左递归。
简单!”男孩,我错了。我不知道如何在不进入无限循环的情况下实现它,即使我把 mul 放在前面。
任何建议都将受到高度赞赏。您可以节省我周六的工作量并提高我的自尊心!先感谢您。
编辑:添加了我缺少的总和谓词:
prolog - 后继算术 Prolog Mod 函数
如何在序言中为后继算术(皮亚诺数)编写mod/3函数?