问题标签 [meta-predicate]

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 投票
1 回答
68 浏览

list - 从多个列表中删除项目

我有一个子问题,其解决方案比我怀疑的要大得多。

问题定义如下

从 group 具有 Y 和 Z 或 A 和 B 之间 id 的所有组中删除 X

表示为一个伪查询它看起来像这样 Y,Z,A,B 设置为 0,1,3,4

结果将是

所以,我对此的解决方案是:

当当前周期的开始小于或等于当前周期的结束时,分组删除 X,同时“递增”一天的开始。重复直到没有更多的时期

删除组中的 X 是通过“循环”所有组来完成的,并检查它是否与时间段匹配,以及是否确实将用户从子组中删除,这又是通过“循环”完成的。

这是一个非常乏味但直接的解决方案,现在我的问题是我经常发现自己在做这样的事情,并且找不到以不太全面的方式来做这件事的方法。

除了我的方法之外,还有其他方法不涵盖 50 多行吗?


更新

非常感谢,代码变得更加简洁 - 它可能会更进一步,但现在可以在这里实际发布(这有点修改 - 但逻辑就在那里)

0 投票
1 回答
1278 浏览

list - 具有参数化谓词的映射表

是否可以在中使用参数化谓词mapList

例如,我想做以下操作:按列表迭代,并且对于每个偶数元素(列表仅包含数字)将此元素映射到某个值(此值由谓词的参数设置)。

示例查询:

0 投票
2 回答
141 浏览

prolog - Prolog =.. 谓词的使用

我正在做一个练习,我试图使用 =.. 谓词编写一个过程,该过程删除 List 中 PredName(X) 失败的所有元素,并将剩余列表作为结果返回:

在这种情况下 PredName 被定义为:

例如:

我有以下内容,但我不确定为什么在使用上面的示例进行测试时我会一直出错:

我从这里得到了上面的代码。

0 投票
3 回答
1495 浏览

prolog - 折叠部分列表

这是一个已删除的对该问题的回答引发的问题。这个问题可以概括如下:

是否可以折叠列表,折叠时生成列表的尾部?

这就是我的意思。假设我想计算阶乘(这是一个愚蠢的例子,但它只是为了演示),并决定这样做:

在这里,我需要生成我提供给的列表foldl。但是,我可以在常量内存中做同样的事情(不生成列表也不使用foldl):

这里的要点是,与使用 的解决方案不同foldl,它使用常量内存:无需生成包含所有值的列表!

计算阶乘并不是最好的例子,但接下来的愚蠢更容易理解。

假设我真的很害怕循环(和递归),并坚持使用折叠来计算阶乘。不过,我仍然需要一份清单。所以这是我可能会尝试的:

令我惊讶的是,这按预期工作。我可以在部分列表的头部使用初始值“播种”折叠,并在使用当前头部时继续添加下一个元素。的定义fac_foldl/4几乎与fac_b_1/4上面的定义相同:唯一的区别是状态的维护方式不同。我的假设是这应该使用常量内存:这个假设是错误的吗?

我知道这很愚蠢,但是它对于折叠折叠开始时无法知道的列表可能很有用。在最初的问题中,我们必须找到一个连接区域,给定一个 xy 坐标列表。将 xy 坐标列表折叠一次是不够的(但是您可以分两次进行;请注意,至少有一种更好的方法可以做到这一点,在同一篇 Wikipedia 文章中引用,但这也使用了多次;总的来说,多遍算法假设对相邻像素的恒定时间访问!)。

自己对原始“区域”问题的解决方案如下所示:

使用与上面相同的“技术”,我们可以将其扭曲成折叠:

这也“有效”。折叠留下了一个选择点,因为我没有像fac_foldl/4上面那样清楚地表达结束条件,所以我需要在它之后进行切割(丑陋)。

问题

  • 有没有一种干净的方法来关闭列表并删除削减?在阶乘示例中,我们知道何时停止,因为我们有额外的信息;但是,在第二个示例中,我们如何注意到列表的后面应该是空列表?
  • 有没有我遗漏的隐藏问题?
  • 这看起来有点类似于带有 DCG 的隐式状态,但我不得不承认我从来没有完全了解它是如何工作的;这些有联系吗?
0 投票
2 回答
291 浏览

prolog - 我可以在 call/2 中添加参数列表吗?

call(Goal,Arg)允许将参数 Arg 附加到 Goal 的参数并调用结果目标,例如

是相同的

但是,我不想附加到参数列表,而是预先添加,例如

应该导致

如何将参数添加到目标参数列表中并调用结果目标?

0 投票
1 回答
138 浏览

prolog - 如何在 Sicstus Prolog 中的 CSP 中设置对变量的域

我正在使用 Sicstus Prolog,并且正在尝试解决 Domino Puzzle。

我有一个包含三元组的列表,我需要设置它的域。我知道如何设置单个变量的域或单个变量的列表,但是如果我的列表有三元组,并且三元组的每个元素都有不同的域,我该怎么做?

我想做的是:

如何在不必明确说明每个变量的情况下做到这一点?

0 投票
2 回答
172 浏览

prolog - 对谓词进行抽象

我正在尝试的练习从以下事实开始

...并要求读者定义一个谓词travel/3,例如,

...会找到像这样的解决方案

这是我想出的:

它似乎工作...

...但它伤害了我的眼睛;所有这些重复都是对抽象的呐喊。

我试图通过定义来消除重复

...并重新定义travel/3

...但结果还没有:

如何强制将oneLeg结果中的实例替换为特定byCarbyTrain, 或byPlane“证明”oneLeg实例?

0 投票
1 回答
165 浏览

prolog - 在 prolog 中转换元谓词

我一直在阅读并注意到像call这样的谓词被称为元谓词,它们可以返回其他谓词作为结果(不知道 return 是否在这里很好地使用了这个词)例如这里:

编辑:潜伏者打电话给我讲道理,这不起作用。

我知道它不应该调用谓词函数,但是有没有办法对一个直到运行时才知道的谓词进行断言?

我想对多个 fact 使用相同的插入谓词,因此 assert(fact(X)) 不适合我的需要。我可以在运行时检索事实的名称,但是如何在不直接统一事实的情况下使用断言?

0 投票
4 回答
1168 浏览

prolog - 在 Prolog 中对列表进行算术计算

我们目前正在研究谓词reduce的实现,它需要一个列表L,一个二元函数F,它对L的元素进行操作,并且具有中性元素N,并将它们映射到通过将F应用于获得的数字E L 的元素递归。

到目前为止,这是我们的代码:

问题是:对于相同的示例查询,例如?- reduce([], add, 0, R).我们只得到一个布尔值(在这种情况下为真),对于其他人返回一个错误,这告诉我们我们的参数没有正确实例化。我们真正的目标是像 Response 一样R = 0。(对于上面给出的示例)。

希望你能帮助我们,请不要太复杂,因为我们是 Prolog 初学者;)

0 投票
3 回答
578 浏览

prolog - 为什么 maplist/3 不使用模板?

maplist /3谓词具有以下形式

然而,非常相似的函数findall/3具有以下形式

它不仅有一个目标,还有一个模板。我发现这个模板在很多地方都非常有用,并开始怀疑为什么 maplist/3 没有。

为什么 maplist/3 没有模板参数,而 findall/3 有?这些谓词之间的显着区别是什么?