问题标签 [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.

0 投票
2 回答
181 浏览

prolog - 如何使用 dif/2 防止生成序列中的重复?

这个问题是在回答StackOverflow上的另一个问题时出现的,该问题是(概括一点)生成由有限元素集形成的所有序列,没有重复出现。

正如鲍里斯在评论中正确指出的那样,这个问题有许多现有的解决方案。但是,我对不使用累加器(即,与新选择的元素进行比较的已选择元素的列表)但使用dif/2语句的解决方案感兴趣。

为了说明,在我的以下程序中,我有 4 个元素,并且在 4 次递归调用之后,有几个div/2语句声明到目前为止已经选择的 4 个元素是成对不同的。由此可以推断,继续递归并寻找第五个元素是没有意义的,因为给定的div/2语句已经没有元素了。有没有办法将这些“知识”编码到程序中,使其不再循环?

当前的循环行为:

0 投票
2 回答
5015 浏览

prolog - 使用 Prolog 获得独特的结果

我有这个返回的 Prolog 代码:[[vincent,vincent],[vincent,marcellus],[marcellus,vincent],[marcellus,marcellus],[pumpkin,pumpkin],[honey_bunny,honey_bunny]]

当 X != Y 时如何得到唯一的结果?我尝试了以下代码以获得与以前相同的结果。

有了\=,我得到了[]。如何只得到[vincent,marcellus]结果?

0 投票
1 回答
86 浏览

prolog - 我只是没有得到的 Prolog 程序

我有一个性别数据库:

前任:

我需要为网球比赛编写一个函数(混合双打:每边有 2 个不同的性别)。所以如果你要求让我们说:

matchMixte(equipe(X,emma),equipe(Y,Z)) , X, Y, Z应该返回可能的合作伙伴的组合。

对不起法国人。

  • equipe 是团队的意思。
  • homme 是男人的意思
  • 女人

我已经有很多事情了,但我知道我走错了路。如果你因为篇幅而不能帮助我,我会理解的

这是我到目前为止的工作。

0 投票
1 回答
871 浏览

prolog - 是否有“通配符”运算符的反义词专门在 Prolog 中找不到指定的项目?

我发现很难为这个问题提出一个标题,所以我会在这里尽我所能解释我的问题。

在 Prolog 中,您可以在谓词中使用 _ 运算符来获取所有定义,而不管那里存在什么,在我的示例中:

在这里,如果我想找到所有为马德里效力的球员,我可以使用:

无论进球如何,它都会返回感兴趣的球员。

然而,我真正想要的是预定义的马德里队,所有不是马德里队成员的球员。就像是:

这样的事情存在吗?我正在使用 Prolog 版本 5.10.2。

谢谢

0 投票
2 回答
1183 浏览

list - 我想计算列表中某个元素的出现次数

我想计算列表中某个元素的出现次数,如果有,则谓词唯一性为真,否则为假。但是,如果元素出现不止一次,Prolog 会发现它是真的。我不知道该怎么办...

0 投票
2 回答
177 浏览

prolog - 如果元素不等于字符串,Prolog 添加到列表

我正在尝试创建一个具有非空 Guard 元素的对列表。

这是我尝试过的,但似乎不起作用。正确的方法是什么?

0 投票
3 回答
342 浏览

list - 如何从序言中的列表中删除每个出现的子列表?

这是从给定列表中删除或删除元素的代码:

如何修改它,以便我可以从列表中删除每个出现的子列表?

当我试图将一个列表放入一个元素时,它只会删除该元素并且只删除一次。

应该是这样的:

0 投票
8 回答
944 浏览

prolog - different/2 - 是否存在纯粹的、确定的定义?

虽然从声明的角度来看,这个定义使用member/2andnon_member/2几乎是1完美的,但它为某些查询产生了冗余的解决方案,并在周围留下了选择点。

什么是在此基础上改进的定义(以纯粹的方式可能使用if_/3and (=)/3)使得完全相同的一组解决方案被描述different/2但至少对于地面查询是确定的(因此不会留下任何无用的选择点)并省略(如果可能)任何多余的答案?


1 其实,different([a|nonlist],[]), different([],[b|nonlist])成功了。它同样可能失败。因此,两者都失败的解决方案很好(甚至更好)。

0 投票
4 回答
1401 浏览

prolog - Prolog:如何避免没有削减的回溯?

所以我试图在序言中编写一个谓词,它可以采用列表 L1 和列表 L2 并返回 L1 中不在 L2 中的所有元素的列表。这是我到目前为止所拥有的:

这可行,但是它给出了多个答案,例如:

这是一个问题,因为我正在使用这个谓词来整理图中的路径(L1 是我可能去的节点列表,L2 是我已经去过的节点)以确保我不会再访问同一个节点不止一次并陷入循环。但是这个实现让我陷入了一个循环,因为它在尝试使用第一个 X 并且失败后回溯到未更改的 X,进入可以相互到达的相同两个节点之间的无限循环。我知道这很容易通过向 nocontains 添加削减来解决,如下所示:

但是有没有办法在不削减的情况下达到同样的效果?所以当我使用 notin 时,我只能得到一个可能的答案?(它是针对学校的,部分任务是不使用任何内置谓词或控制运算符)

编辑:

只是为了更具体地说明赋值的限制:它应该由纯事实和规则组成,我们不允许使用任何内置的谓词或控制结构(包括但不限于算术,削减或否定作为失败)。分号没问题。我们需要定义自己的任何实用谓词。

感谢所有答案,但我开始认为我用于在图中查找两个节点之间的路径的方法可能是一个问题,因为从答案来看,似乎没有简单的方法这个。

0 投票
1 回答
548 浏览

list - 如果直接插入,为什么 Prolog 会将变量与失败的结果匹配?

我正在制作一个 Prolog 程序来查找一组列表的子集。这个子集必须匹配一些特定的条件,其中一个方面是子集的列表不能相同。令我困惑的是,当我尝试查找变量 X 的匹配项时,如果我将它们插入查询中而不是 X,它会生成返回 false 的结果。例如:

如果直接插入时返回 false,它怎么可能将 X 与 [[7], [7]] 匹配?

containsSet 的想法是找到一个长度为 N(在本例中为 2)的列表子集,该子集在匹配位置没有匹配元素(即子集中没有两个列表具有相同的第一个元素或相同的第二个元素等) . 在上面的示例中,[7] 和 [7] 的第一个(也是唯一一个)元素匹配,因此它返回 false。