问题标签 [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.
list - 从多个列表中删除项目
我有一个子问题,其解决方案比我怀疑的要大得多。
问题定义如下
从 group 具有 Y 和 Z 或 A 和 B 之间 id 的所有组中删除 X
表示为一个伪查询它看起来像这样 Y,Z,A,B 设置为 0,1,3,4
结果将是
所以,我对此的解决方案是:
当当前周期的开始小于或等于当前周期的结束时,分组删除 X,同时“递增”一天的开始。重复直到没有更多的时期
删除组中的 X 是通过“循环”所有组来完成的,并检查它是否与时间段匹配,以及是否确实将用户从子组中删除,这又是通过“循环”完成的。
这是一个非常乏味但直接的解决方案,现在我的问题是我经常发现自己在做这样的事情,并且找不到以不太全面的方式来做这件事的方法。
除了我的方法之外,还有其他方法不涵盖 50 多行吗?
更新
非常感谢,代码变得更加简洁 - 它可能会更进一步,但现在可以在这里实际发布(这有点修改 - 但逻辑就在那里)
list - 具有参数化谓词的映射表
是否可以在中使用参数化谓词mapList
?
例如,我想做以下操作:按列表迭代,并且对于每个偶数元素(列表仅包含数字)将此元素映射到某个值(此值由谓词的参数设置)。
示例查询:
prolog - Prolog =.. 谓词的使用
我正在做一个练习,我试图使用 =.. 谓词编写一个过程,该过程删除 List 中 PredName(X) 失败的所有元素,并将剩余列表作为结果返回:
在这种情况下 PredName 被定义为:
例如:
我有以下内容,但我不确定为什么在使用上面的示例进行测试时我会一直出错:
我从这里得到了上面的代码。
prolog - 折叠部分列表
这是一个已删除的对该问题的回答引发的问题。这个问题可以概括如下:
是否可以折叠列表,折叠时生成列表的尾部?
这就是我的意思。假设我想计算阶乘(这是一个愚蠢的例子,但它只是为了演示),并决定这样做:
在这里,我需要生成我提供给的列表foldl
。但是,我可以在常量内存中做同样的事情(不生成列表也不使用foldl
):
这里的要点是,与使用 的解决方案不同foldl
,它使用常量内存:无需生成包含所有值的列表!
计算阶乘并不是最好的例子,但接下来的愚蠢更容易理解。
假设我真的很害怕循环(和递归),并坚持使用折叠来计算阶乘。不过,我仍然需要一份清单。所以这是我可能会尝试的:
令我惊讶的是,这按预期工作。我可以在部分列表的头部使用初始值“播种”折叠,并在使用当前头部时继续添加下一个元素。的定义fac_foldl/4
几乎与fac_b_1/4
上面的定义相同:唯一的区别是状态的维护方式不同。我的假设是这应该使用常量内存:这个假设是错误的吗?
我知道这很愚蠢,但是它对于折叠折叠开始时无法知道的列表可能很有用。在最初的问题中,我们必须找到一个连接区域,给定一个 xy 坐标列表。将 xy 坐标列表折叠一次是不够的(但是您可以分两次进行;请注意,至少有一种更好的方法可以做到这一点,在同一篇 Wikipedia 文章中引用,但这也使用了多次;总的来说,多遍算法假设对相邻像素的恒定时间访问!)。
我自己对原始“区域”问题的解决方案如下所示:
使用与上面相同的“技术”,我们可以将其扭曲成折叠:
这也“有效”。折叠留下了一个选择点,因为我没有像fac_foldl/4
上面那样清楚地表达结束条件,所以我需要在它之后进行切割(丑陋)。
问题
- 有没有一种干净的方法来关闭列表并删除削减?在阶乘示例中,我们知道何时停止,因为我们有额外的信息;但是,在第二个示例中,我们如何注意到列表的后面应该是空列表?
- 有没有我遗漏的隐藏问题?
- 这看起来有点类似于带有 DCG 的隐式状态,但我不得不承认我从来没有完全了解它是如何工作的;这些有联系吗?
prolog - 我可以在 call/2 中添加参数列表吗?
call(Goal,Arg)允许将参数 Arg 附加到 Goal 的参数并调用结果目标,例如
是相同的
但是,我不想附加到参数列表,而是预先添加,例如
应该导致
如何将参数添加到目标参数列表中并调用结果目标?
prolog - 如何在 Sicstus Prolog 中的 CSP 中设置对变量的域
我正在使用 Sicstus Prolog,并且正在尝试解决 Domino Puzzle。
我有一个包含三元组的列表,我需要设置它的域。我知道如何设置单个变量的域或单个变量的列表,但是如果我的列表有三元组,并且三元组的每个元素都有不同的域,我该怎么做?
我想做的是:
如何在不必明确说明每个变量的情况下做到这一点?
prolog - 对谓词进行抽象
我正在尝试的练习从以下事实开始
...并要求读者定义一个谓词travel/3
,例如,
...会找到像这样的解决方案
这是我想出的:
它似乎工作...
...但它伤害了我的眼睛;所有这些重复都是对抽象的呐喊。
我试图通过定义来消除重复
...并重新定义travel/3
为
...但结果还没有:
如何强制将oneLeg
结果中的实例替换为特定byCar
的byTrain
, 或byPlane
“证明”oneLeg
实例?
prolog - 在 prolog 中转换元谓词
我一直在阅读并注意到像call这样的谓词被称为元谓词,它们可以返回其他谓词作为结果(不知道 return 是否在这里很好地使用了这个词)例如这里:
编辑:潜伏者打电话给我讲道理,这不起作用。
我知道它不应该调用谓词函数,但是有没有办法对一个直到运行时才知道的谓词进行断言?
我想对多个 fact 使用相同的插入谓词,因此 assert(fact(X)) 不适合我的需要。我可以在运行时检索事实的名称,但是如何在不直接统一事实的情况下使用断言?
prolog - 在 Prolog 中对列表进行算术计算
我们目前正在研究谓词reduce的实现,它需要一个列表L,一个二元函数F,它对L的元素进行操作,并且具有中性元素N,并将它们映射到通过将F应用于获得的数字E L 的元素递归。
到目前为止,这是我们的代码:
问题是:对于相同的示例查询,例如?- reduce([], add, 0, R).
我们只得到一个布尔值(在这种情况下为真),对于其他人返回一个错误,这告诉我们我们的参数没有正确实例化。我们真正的目标是像 Response 一样R = 0
。(对于上面给出的示例)。
希望你能帮助我们,请不要太复杂,因为我们是 Prolog 初学者;)