问题标签 [prolog-cut]
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 - 如何使用剪切运算符?
我一直在学习,我遇到了一个问题。我从教程中了解了 cut 运算符,但我正在尝试解决问题,但我无法理解解决方案。
问题:
如果汽车颜色是红色,意大利制造,那么它就是法拉利。如果它是红色但在德国(或任何其他国家。可能不止一个)制造,那就是奔驰。如果它不是红色的并且很大,那就是福特。不红也不大,就是丰田。
那是:
给定特定汽车对象的一些事实:
我想编写一个谓词brand(X, name)
来返回特定汽车对象的品牌,例如:
问题是我如何(以及在哪里)在这里使用 cut 运算符,以便它不会检查相同的属性(例如:这里的“make”)两次?我似乎无法解决这个问题。
如果我检查红色然后检查制造,如果制造结果不是意大利,我如何brand(X, brand_name)
为汽车对象“ck”编写一组事实,使其不再检查制造?在我看来这是不可能的。
prolog - Prolog中割算子的交换性
我目前正在学习 Prolog,并且在我正在阅读的其中一篇笔记中给出了如何正确使用 cut 运算符的示例。考虑以下函数以从列表中删除特定值的所有元素。
由于回溯,这不是函数的正确定义,函数将返回从删除特定值的某些元素获得的列表的所有子列表,但不一定是所有子列表。我正在阅读的注释说解决此问题的正确方法是将第二行替换为
但是将行替换为
是不正确的。我不确定为什么第二个示例是修复该功能的不正确方法。在 swipl 中,用这些修复替换第二个术语似乎总是在我考虑的测试用例上返回相同的答案。我在这里想念什么?
prolog - 如果剪切“!”,执行上有什么区别?存在?
“!”的作用是什么?因为我在上面和下面的代码中得到相同的输入输出?
我是 Prolog 的新手。
prolog - 序言逻辑和剪切
我在理解 prolog 的流程时遇到了一些问题。这是代码:
现在我正在运行 3 件事:1. r([3,7,9],R)。2. r([5,11,13],R)。3. r([2,3,5],R)。我无法理解我得到的答案。答案是:1. 3 错误。2. 5 11 错误。3.会员3假。
希望得到帮助!
prolog - 在 Prolog 编程中使用 Cut 和 Not
我是 Prolog 编程的新手。所以我想知道以下。我知道在 Prolog 中使用 Cut (!)。有人可以解释一下,Prolog 中 Not 的使用,何时以及如何使用 Not 以及如何在不使用 Cut 的情况下重写以下内容并避免回溯。(仅使用谓词)
并解释我如何重写以下内容(仅使用谓词)
recursion - Prolog程序使用递归从数字倒数
最近我一直在学习 Prolog 并尝试编写一个程序来使用递归从一个数字倒数到另一个给定的数字,但它似乎不起作用,代码如下:
第一条规则count_down(L, L) :- !.
是当计数达到 L 时终止循环。
prolog - Prolog Cut 运算符
我将我的知识库定义为:
现在,要使用上述知识库,我使用以下内容:
对于这两个查询,Prolog 都返回 true。我希望 Prolog 首先在本地检查属性游泳,然后查看直接父级,依此类推。一旦我们知道辛巴“必须学会”游泳,它就应该停止搜索,并且不应该再往下看。因此,它应该为第一个查询返回 false,为第二个查询返回 true。
我知道必须通过限制回溯来完成。我尝试使用 cut 而不是运算符,但没有成功。有没有办法做到这一点?
prolog - Prolog,关于如何形成更好的从句
我有以下条款:
当我输入查询时:
它只返回:
这就是我想要的。
但是当我输入这个查询时:
它只返回:
那么如何修改子句使其返回:
谢谢
list - 字符串列表的最长公共前缀 (LCP)
到目前为止,这是我的代码。我该如何优化它以便打印前缀,例如:
应该返回"inte"
Prolog 有点生疏,有一段时间没做过了:)
prolog - 在编写纯粹的关系序言程序时,可以使用精心放置的剪辑吗?
我正在尝试编写一个管理键值存储的关系序言程序。初始代码取自我在互联网上找到的一些讲座幻灯片(http://people.eng.unimelb.edu.au/pstukey/book/course.html - 请参阅:使用数据结构幻灯片)。
这段代码允许用同一个键添加多个值——这对我来说很好。但是,它也会两次添加相同的键、值对,例如
D3 包含两次 p(a,1)。
为确保不会发生这种情况,我添加了以下代码;并且为了确保回溯找不到替代的 addkey 子句,我在第一个子句的末尾添加了一个剪切。
对于纯粹的关系程序来说,这是公平的游戏吗?或者是确保不添加重复键、值对的更好方法——而不使用切割。
这导致以下结果:
不,有更多解决方案可用——程序立即返回。
任何建议都非常感谢,
丹尼尔
注意:顺便说一句:如果我为相同的键添加不同的值,则剪切确实允许回溯以识别相同键的第二个值: