问题标签 [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无限地检查不可能的解决方案?
假设以下程序:
它非常适合添加两个数字,但是当我尝试以下排序的查询时:
Z
在很明显没有解决方案(即Z>s(0)
)之后,它会继续搜索可能的值很长时间
我熟悉 cut( !
) 运算符,我的直觉说解决方案与它有关,我只是不确定在这种情况下如何使用它。
prolog - Prolog 定义自然数的步骤是什么?
我正在学习如何在 Prolog 中编程,我找到了下一个定义自然数及其总和的程序:
(在这里找到)
问题是我正在努力解决这个程序的执行流程。说实话我不知道它是做什么的。Prolog 如何计算出答案的价值?Prolog 遵循哪些步骤来找到答案的值?
提前致谢。
prolog - 使用 s(0) 和 p(0) 进行 Prolog 计数
我的序言考试的部分修订存在一些问题。
我需要创建一个递归语句,称为 simple/2。一个示例用途是
这将导致Z
s(0)。S代表后继者,P代表前身。所以:
s(0)
是 1、
s(s(0))
是 2 和p(0)
是 -1 等等,并且
p(s(p(p(0))))
会是p(p(0))
。
我最初拥有的代码是
但这显然不起作用,因为第二部分需要保留为在递归调用期间添加到自身的变量。大约 30 分钟后我会再看一遍,因为我现在头都炸了。
prolog - 有人可以解释如何统一以在明确的从句语法中得到答案吗?
我正在尝试理解定句语法中统一的概念,是否有人能够逐步解释如何从以下 DCG 中得到答案。
答案产生aaabbb
了,但我已经在网上搜索了很长时间,试图找到你如何得到这个答案,如果有人可以通过几个步骤来解释这个问题,我将永远感激不尽,或者至少展示一下工作,所以我可以看到怎么了。
在 DCG 的维基百科页面上可以找到一个类似的示例,但它会生成aaabbbccc
.
谢谢
prolog - 尝试编写树高谓词 - 我需要 Peano 风格的自然数吗?
作为一个基本的 Prolog 练习,我为自己设定了编写一个可以向前和“向后”工作的二叉树高度谓词的任务——也就是说,除了确定已知二叉树的高度外,它应该能够找到所有二叉树已知高度的树木(包括不平衡的树木)。这是迄今为止我想出的最好的解决方案......
第一个参数是高度,表示为一个列表 - 元素无关紧要,列表的长度表示树的高度。所以我基本上是在滥用列表作为 Peano 风格的自然数。方便的原因是...
- 不用担心负数。
- 我可以在不知道确切数字的情况下检查 > 或 >= - 例如,通过匹配列表头部的两个项目,我确保列表长度 >=2 而无需关心尾部的长度。
这些属性似乎都不适用于 Prolog 数字,到目前为止,我想不出一种方法来采用相同的基本方法来使用实际数字来代替这些列表。
我在 Prolog 中看到了一些使用 Peano 风格数字的例子,所以我的问题是 - 这是正常的做法吗?或者有什么方法可以避免我还没有发现的问题?
此外,有没有一种方法可以转换为/从不会破坏双向性的 Peano 风格的表示?由于相当明显的原因,以下内容不起作用......
到目前为止,我能想到的最好的方法是在实现之间进行选择的 is-this-variable-instantiated 测试,这对我来说似乎是在欺骗。
顺便说一句 - 我对其他方法有一些想法,我不想剧透 - 特别是一种动态编程方法。我真的专注于充分理解这次特殊尝试的教训。
prolog - prolog 使用递归查找后继
我现在正在尝试学习序言,并且开始了递归主题。遇到了这个例子作为继任者。
我确实理解它在理论上是如何工作的。它采用数字 X 并 succ 递增它。我的问题是, succ 是内置谓词吗?或者在这个例子中还有其他事情发生。示例取自 learnprolognow.org
然后我遇到了这个练习
它是用来表示二进制的,即 0 是 f0(null),1 是 f1(null),2(10) 是 f0(f1(null)),3(11) 是 f1(f1(null)) 等。该问题要求使用 pterms 定义谓词 (P1, P2) 以使 P2 成为 P1 的后继。有人可以为我更详细地解释这个问题吗?我现在看到的方式是,我必须遍历 P1 直到结束,然后将其与 P2 进行比较,但我不太确定语法。任何提示都会很有用
prolog - s(X)-sum 的更好终止
(让我在期中问题的浪潮中偷偷摸摸。)
两个自然数之和的常见定义是nat_nat_sum/3
:
严格来说,这个定义太笼统了,因为我们现在也成功了
同样,我们得到以下答案替换:
我们将此答案替换解释为包括所有自然数,而不关心其他术语。
鉴于此,现在让我们考虑它的终止属性。事实上,考虑以下故障切片就足够了。也就是说nat_nat_sum/3
,如果这个切片没有终止,不仅不会终止。这一次他们完全一样!所以我们可以说iff。
这个失败切片现在暴露了第一个和第三个参数之间的对称性:它们都以完全相同的方式影响非终止!因此,尽管它们描述了完全不同的事物——一个是总和,另一个是总和——但它们对终止的影响完全相同。可怜的第二个论点没有任何影响。
可以肯定的是,不仅故障片在其通用终止条件(使用 cTI)中相同,其读取
对于此条件未涵盖的情况,它也以完全相同的方式终止,例如
现在我的问题:
nat_nat_sum/3
是否存在具有终止条件的替代定义:(如果是,请出示。如果不是,请说明原因)
换句话说,如果新定义的一个论点已经是有限且有基础的,则新定义nat_nat_sum2/3
应该终止。
精美的印刷品。只考虑纯粹的、单调的 Prolog 程序。也就是说,除了(=)/2
和之外没有内置插件dif/2
(我将为此奖励 200 赏金)
prolog - 在 swi-prolog 中乘以 peano 整数
我目前正试图在 Prolog 中解决一个简单的“乘 peano 整数”问题。
基本规则
- 一个peano整数定义如下:0 -> 0;1 -> s(0); 2 -> s(s(0)) s(s(s(0) -> 3 等等。
- 关系定义如下: multiply(N1,N2,R)
- 在哪里
- N1 是第一个 peano 整数(例如 s(s(0)))
- N2 是第二个 peano 整数(例如 s(s(0)))
- R 是生成的新 peano 整数(如 s(s(s(s(0)))))
- 在哪里
我知道 Prolog 默认提供基本算术逻辑,但我正在尝试使用 peano 整数实现基本算术逻辑。
由于乘法基本上是重复加法,我认为它可能看起来像这样:
序言尝试
问题是我不知道如何让prolog根据系数运行循环N次,添加peano整数并建立正确的结果。我相信这很容易实现,并且生成的代码可能不会超过几行代码。几个小时以来,我一直在努力实现这一目标,这让我很生气。
非常感谢您的帮助,还有……圣诞快乐!
麦克风
prolog - 提示不回来
我尝试做一些练习 - 以“s 表示”表示数字,这意味着“0”为零,s(0) 为 1,s(s(0)) 为 2,依此类推。我尝试编写谓词来添加“s numbers”:谓词 s2int 将“s number”转换为 int。
当我查询添加时,它会写入正确的答案,但提示不会回来。有什么问题?
recursion - 理解 Prolog 中的递归规则和统一
我是遵循“LearnPrologNow!”的 Prolog 初学者。一套教程。我正在尽我所能掌握概念和词汇。当遇到这个问题时,我已经能够理解所有内容,直到第 3 章递归定义:
给定查询
现在,我了解到该程序的想法是 Prolog 将开始在该系统中按以下顺序计数数字
但我不明白是什么导致它每次“缩减”并上升。我理解统一的原则是程序试图统一X的查询,但是它应该只遵循递归规则一次,然后返回零吗?是什么允许它在查询周围添加一个 succ() ?那不是在相反的方向遍历递归规则吗?