问题标签 [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.
prolog - Prolog 检查重复项以回答查询(简单的方法?)
这是一个可怕的例子,但是假设我有点a
,b
还有c
蓝色和红色线,例如line(blue,a)
表示a
蓝线上的点线。
我想找出哪些点P
位于不止一条线上(所以a
在这种情况下,它位于蓝线和红线上)。
我开始了,得到了这个:
当我运行查询时?- multiple_points(P).
,一行上的所有点都会出现,但我只想显示重复项以查看哪些点出现在多条线上。
是否有一种简单的单行方式只显示P
重复值?
prolog - Prolog 关于谓词的推理
假设有人写了以下大量子句:
现在我想在给定一些高阶谓词和规则的情况下自动生成互惠子句,类似于:
所以我有以下预期的结果:
为了简单起见,我忽略了 list 参数,而是reciprocal(loves).
用一些复杂的规则定义了简单的子句 using reciprocal(X)
,但我似乎无法assert
成功地使用规则。
我尝试了不同的变体和排序
或(添加推导子句本身)
但我只有使用 SWI-Prolog 之false
类的错误。Arguments are not sufficiently instantiated
我的问题是(显然):我怎样才能使这条规则起作用?我不在乎规则是数据库的一部分还是只是将实际子句添加到数据库的预处理器(尽管前者会更好),我只想学习如何推理谓词(即如何使用更高的序谓词)。
注意:我只学习了一个月的逻辑编程,我想尝试一下 Notation3 和 N-triples 等的一些想法。
编辑:
缺少的部分,蛋糕上的绝对樱桃,是一些使用类似于规则的动态解决方案
如果有人对此有一些解决方案,请发布!
prolog - 如何根据元素类型对列表中的元素进行谓词
给定格式列表,
在项目的数量不固定的情况下,其他项目的数量也不是固定的,但项目总是在其他项目之前,我如何拆分列表以便我可以将项目和其他项目传递到不同的谓词中。
我一直在尝试寻找基于元素拆分列表的方法,但无法找到这样做的方法。
我需要编写一个谓词来获取这个列表,然后将项目传递给 an itemPredicate
,将其他项目传递给otherPredicate
.
如果我可以提供任何其他信息,请告诉我。
module - 在 SWI-Prolog 中 meta_predicate 的数字参数是什么意思?
我正在编写一个 Prolog 程序,并且我正在尝试将模块合并到程序设计中以封装复杂性以减少冗余功能。
我遇到困难的一个特性是元谓词的使用。我想在一个模块中定义一个元谓词,然后将其导入另一个模块;这带来了复杂性。幸运的是,该meta_predicate
指令有助于解析模块前缀,但我无法理解此处描述的参数:https ://www.swi-prolog.org/pldoc/man?section=metapred
具体来说,我在使用数字参数时遇到了问题。根据文档:
参数是一个术语,用于引用比给定参数术语多 N 个参数的谓词。例如:call(0) 或 maplist(1, +)。
我了解由数值表示的参数将是用于引用谓词的术语。我不明白被引用的谓词如何比参数项有更多的参数。有人可以更深入地解释数字参数何时适合,或者举例说明何时适合使用它?
prolog - 像功能映射函数一样努力使用 Prolog 的 maplist/2
我正在使用 SWI-prolog 并且我正在尝试创建一个辅助函数,它将映射到一个列表并将每个元素与给定的整数相乘。我的意图是创建一个对应于 Haskell 函数的谓词multByN x n = x * n
并在这个意义上使用它:
map (multByN 3) [1,2,3]
这会将所有元素乘以 3 并产生[3,6,9]
我在 Prolog 中搜索了相应的谓词,maplist/2
但发现我只能使用它来检查布尔条件是否适用于列表中的每个元素,而不是实际返回一个新的、已处理的列表。我了解这是如何工作的:
isEven(X) :- 0 is X mod 2
maplist(isEven, [2,4,6])
给true
.
但是,我不明白人们会如何做一些事情,比如maplist(multByN(3), [1,2,3])
将一些变量与[3,6,9]
. 由于我无法弄清楚这一点,我尝试实现我自己的映射函数,将我的谓词映射multByN
到一个列表,我得到了一些看起来正确的东西,但事实并非如此。我有这个:
使用这个谓词我得到:
在这里,我实际上是在打印最终列表以查看它的外观,但我们可以看到查询实际上并没有说X = [9,6,3|_1746]
,所以我实际上并没有统一任何东西,据我所知,我只是打印它- 那不是我什么。这里的另一个问题是_1746
我想摆脱的未实例化变量,特别是当我尝试反转列表时,我得到了无穷无尽的答案和未实例化的变量。
理想情况下,我想知道如何使用maplist/2
和我自己的谓词来解决问题,但是我认为其他人会对学习如何使用更感兴趣,maplist/2
这对我来说已经绰绰有余了。
module - 不合格的断言会在哪些模块中添加术语?
我感觉合理。但是后来(从头开始)....
但是之后...
foo2
当我不提foo2
. 为什么frobnoz:f
第二个例子成功,第三个例子失败?
什么是模块?我以为它们是名称空间,但现在很困惑。
lambda - Prolog 中的 Lambda 表达式?
我通常能够弄清楚 Lambda 与 maplist 的一些用法,但通常很难在 prolog 中使用 lambda。可能是因为它与其他语言不同,因为统一。
这是症结之一:您如何应用声明的 Lambda 表达式?铁
(奇怪,= 和 \ 之间必须有空格)
你好吗 :
我想做的另一件事是像 FACT 一样存储 Lambda 表达式,以便我可以查询它,但也可以像 lambda 函数一样拥有它,这样我就可以稍后进行绑定..fe 就在我的头顶......我可能认为它错了..
实例化:
或部分:
询问 :
concurrency - 接收目标列表作为输入的元谓词
我已经实现了以下元谓词,它使用 SWI-Prolog 引擎同时枚举两个或多个可回溯谓词的解决方案。
使用示例:
我的问题是:我应该如何声明这个元谓词?
prolog - Prolog“切换”语句
如何实现等效于嵌套的一组if_
s 的 switch 语句?
理想情况下是这样的(不要介意语法):
工作方式与此相同:
prolog - Prolog 中的功能模式
如何创建一个接受另一个谓词并返回它的派生版本的谓词?
例如,成对谓词可以相当机械地扩展以应用于列表:
的定义是什么
如果不可能/常见/笨拙/违反原则,那么替代模式是什么?