问题标签 [prolog-dif]
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.
list - 消除连续重复
消除列表元素的连续重复。
我的解决方案是:
而且,由于我是初学者而且我没有逻辑范式的经验,所以我请你说出我可以改进的地方以及为什么我的解决方案不能做到最好。
例如,X \= Y
在我看来并不漂亮。
list - Prolog - 检查两个列表是否具有相同的元素,除了一个
我正在使用两个字符列表,我想检查它们是否具有相同的元素,除了一个位于相同位置的元素,如下所示:
这是可行的,但有一种简化的方法吗?
谢谢。
list - Prolog - 如何限制变量列表长度
我无法生成符合特定条件的所有列表。
当我发出查询cities(L)
时,我希望它生成最大长度为 2 且不重复的所有城市列表。它现在所做的是返回所有可能的列表,然后继续尝试显然不符合标准的列表。
我如何告诉 Prolog 不要尝试太长或重复项目的列表?
list - 计算列表中的出现次数
我正在尝试创建一个规则来计算给定列表中某个元素的出现次数,到目前为止我尝试过的似乎并没有按照我期望的方式工作:
这里的第一个参数应该是列表,第二个参数是我们要查找的元素,最后一个参数是出现次数:
这H
是给定列表的头部和尾部。T
例如,基本情况按预期count([],1,N).
返回N = 0
,但只要列表非空,我们总是会得到false.
:
谁能指出我做错了什么?
更新:
将第二行替换为
但我就是不明白为什么这不等于我的第一个想法。
然后我们得到
哪个是对的。
list - Prolog:删除具有非实例化值的列表成员
我想删除列表中元素的所有出现,类似于this,但在我的情况下,列表可能有未实例化的变量。例如:
和
我尝试将 delMember 定义如下:
有了这个定义,我得到的最后一个结果是正确的,但它仍在尝试在此之前实例化变量。
有任何想法吗???
prolog - 如何验证涉及 dif/2 约束的交换性?
围绕 dif/2 约束有很多炒作,尤其是作为 (\=)/2 和 (\==)/2 的一些非声明性的补救措施。这种非声明性通常以非单调性为特征,并给出了非交流性的例子。
但是测试涉及 dif/2 的测试用例是否可交换的方法是什么。这是我想要做的元解释:
我做了一个交换性测试,我想探测两个变体给出相同的结果:
因此,通常您可以使用 (==)/2 内置谓词检查单调性,如果归结为检查交换性。由于此谓词遵循实例化变量。
但是如果你在测试产生约束的用例, call_with_residue/2 是不够的,你还需要约束相等。这可能很棘手,如以下示例所示:
任何想法如何进行?
免责声明,这是一个陷阱:
我不认可交换性测试是一种好的测试方法,您可以在其中将好的和坏的谓词与规范分开。因为通常好谓词和坏谓词都可能没有交换性问题。
我正在使用交换性测试作为一种工具来了解 Dif/2 约束相等的方法。然后可以在更传统的测试用例中将这种相等用作验证点。
list - `var(A)` 和执行顺序
此页面上的练习 09 http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/要求创建一个将重复元素打包到子列表中的谓词。
一个简单的解决方案是简单的
其中 splitsplit(Head, Tail, HeadGroup, Rest)
被定义为
效果很好,并且与上述网页上提供的示例解决方案非常一致。
该解决方案失败的地方是查询,例如pack(X, [[a], [b, b]]).
. 两个解集之间的对应是双射的(其中每一个只有一个) A
,所以必须有一个更好的解。pack(A, B)
B
解决它的一种方法是更改评估顺序,帮助 prolog 根据参数的类型选择非无限分支,如下所示
这方面的两个问题。
首先,这令人难以置信的丑陋,那么是否有更好的方法来根据参数类型选择规则顺序?
其次,可能是更复杂的问题,有没有办法在没有 的情况下重写解决方案var(A)
,如果没有,为什么?
prolog - Prolog:得到相反的结果
我有以下代码:
或者 :
我知道问题是否定的,我想得到相反的结果,same_position
例如。
M. @CapelliC 建议我使用dif/2
,但我不知道如何在我的具体示例中应用它。
prolog - Prolog 统一与 not()
我只是在学习序言,有一件事我无法理解。
假设我有以下程序
所以a(v).
给了我假的,因为value(v)
可以证明是正确的。
a(w)
给了我真实的,因为没有事实value(w)
,因此,即使尝试,也无法证明它是正确的。
在我的理解中,请求a(X).
应该给我第一个无法证明的可能值value(X)
。应该有无限的可能性,只有value(v)
正确的。
但是为什么 Prolog 一直在回答false
呢?
list - 删除 Prolog 列表中的前导零
我有一个列表,其开头的零个数未知,例如 [0, 0, 0, 1, 2, 0, 3]。我需要去掉这个列表的前导零,使它看起来像 [1, 2, 0, 3]。
这是我所拥有的:
其输出只是 True。读取跟踪表明它正在运行,直到它有一个没有前导零的列表,但随后答案不会传播回堆栈。我对 Prolog 很陌生,所以我不知道如何让它做到这一点。