问题标签 [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.
variables - How can I use a functor name like a variable in Prolog?
We have this assignment for our Prolog course. After two months of one hour per week of Prolog, it is still an enigma to me, my thinking seems unable to adapt from procedural languages - yet.
There is a knowledge base containing predicates/functors with the same name and arities 1, 2 and 3. The call form should be
search(functor_name, argument, S).
The answers should find all occurrences with this functor name and argument, regardless of arity. The answers should be of the form:
I have found out that I could use call to test if the entry in the knowledge base exists.
But call does not seem to work with a variable for the functor name. I am totally baffled, no idea how to use a variable for a functor name.
UPDATE:
My question has been partly answered. My new code gives me true and false for arities 1, 2 and 3 (see below).
UPDATE2:
Another partial answer has come in. That one gives me S as a list of terms, but the "other" arguments are placeholders:
The result is quite nice. Still missing: the Predicate should not be inside the brackets and the other arguments should be taken literally from the knowledge base, not written as placeholders. The current result looks like this:
I am giving up with this question, because the question was posed in the wrong way from the beginning. I should have asked more specifically - which I could not, because I am still no good in Prolog.
@false helped me most. I am accepting his answer.
eclipse - 如何避免 SICStus SPIDER 中的元参数警告?
这可能与comp.lang.prolog-discussion 有关。
在使用带有 SICStus SPIDER 的 Eclipse 时,我收到了几个这样的警告:
这是一个代码示例:
如何摆脱 SPIDER 警告?我对简单地抑制警告并不感兴趣。我正在使用最新版本的 SPIDER IDE (0.0.51) 和 SICStus Prolog 4.2.3。
module - 如何在存在 meta_predicate 声明的情况下对 rec/3 进行编码?
我有以下代码在没有 meta_predicate 声明的情况下可以正常工作。我已经定义了一个谓词 rec/3 如下:
谓词 rec/3 基本上实现了以下高阶递归方程:
其中*是两个关系的合成。例如,它可以用于根据后继定义加法。继任者将是以下关系:
然后可以按如下方式添加(SWI-Prolog):
现在,如果我在 rec/3 的子句之前添加如下 meta_predicate 声明:
事情不再起作用(SWI-Prolog):
如何修复 rec/3 和查询的子句,以便它们在 meta_predicate 存在的情况下工作?
再见
module - predicate_property/2 的第一个参数是什么元参数?
换句话说,应该是0
还是:
其他?Prolog 系统 SICStus、YAP 和 SWI 都将其表示为:
. 这合适吗?不应该是 a 0
which 表示可以被调用的术语call/1
吗?
要检查您的系统类型:
我应该补充一点,元参数——至少在这里使用的形式——不能保证我们期望从纯关系中得到相同的代数属性:
这是来自 ISO/IEC 13211-2 的相关部分:
7.2.2 谓词属性/2
7.2.2.1 说明
predicate_property(Prototype, Property)
如果与参数关联的过程具有谓词属性 ,则
在模块的调用上下文中为真。M
Prototype
Property
...
7.2.2.2 模板和模式
predicate_property(+prototype, ?predicate_property)
7.2.2.3 错误
a)
Prototype
是一个变量
——instantiation_error
。...
c)
Prototype
既不是变量也不是可调用项
—type_error(callable, Prototype)
....
7.2.2.4 示例
...
prolog - 为什么我们使用“!” 在序言中
这是我试图理解的代码。
'!' 有什么用?和上面代码中的谓词 p(,,)。或者任何人都可以在上述代码的每一步中添加注释,以便我能够理解。谢谢。
prolog - 自反传递闭包的定义
许多谓词本质上使用某种形式的传递闭包,只是发现也必须解决终止问题。为什么不使用以下方法一劳永逸地解决这个问题closure0/3
:
是否存在此定义不能用于实现传递闭包的情况?
为什么要区分 / 2?
详细回答@WouterBeek 的评论:dif/2
或者iso_dif/2
是理想的,因为它们能够显示或发出潜在问题的信号。然而,在当前的实现中,顶层循环通常隐藏了实际问题。考虑一下这个目标closure0(\_^_^true,a,b)
,它本身肯定是有问题的。使用以下系统时,实际问题直接不可见。
两个顶级循环都没有显示我们真正想看到的:悬空约束。在 SICStus 中,我们需要一个伪变量来产生一些替换,在 SWI 中,查询必须用call_residue_vars/2
. 以这种方式,现在显示了所有附加了约束的变量。
prolog - Prolog,确定图是否是非循环的
我需要定义一个谓词 acyclic/1 ,它将一个图作为输入并确定该图是否是非循环的。所以根据我的理解
将返回 no 和
将返回是
我做了一个谓词来确定图中的 2 个节点是否连接,如果连接,它们将返回是。
有没有办法可以使用它来确定图形是否是非循环的?
我不想使用任何预定义的谓词。
prolog - 确定图形是否在序言中连接
我需要创建一个谓词isConnected/1
,将图形作为参数并确定对之间是否存在无向路径。
假设我有一个边列表(G
图在哪里):
因此,由于 3 和 4 之间没有边,这应该会失败。
我将如何解决这个问题?我是否必须遍历每个边缘并将边缘记录在列表中?还是有更好的方法来做到这一点?
prolog - 描述关于关系排序的整数序列的最一般的高阶约束
在 CLP(FD) 中,我们经常需要声明:“这是(有时:严格)升序/降序的整数和有限域变量的列表。”
是否有任何 CLP(FD) 系统为此任务提供通用(可参数化)内置约束?
SWI-Prolog 提供了一个名为 的约束chain/2
,这与我正在寻找的类似。但是,这个名称有点过于具体,无法包含约束可以描述的所有关系(例如:#<
不是偏序但在 中是可接受的chain/2
,导致序列 - 被视为一组整数 - 不再算作中定义的链数学顺序理论)。因此,该名称并未完全描述约束实际实现的内容。
请给出关于通常二进制 CLP(FD) 约束的最一般定义——或至少包含 、 和 的合适子集#<
——#>
包括#=<
根据#>=
约束定义的代数结构的专有名称。施加的条件是约束描述了在文献中具有专有名称的实际数学结构。
首先,考虑使用 SICStus Prolog 或 SWI:
示例案例:
请注意,甚至可以允许#\=
,因为该关系仍将描述数学顺序理论中已知的连接。因此,就通常的二进制 CLP(FD) 约束而言,上面的代码并不是最通用的。
prolog - 从谓词中收集所有“最小”解决方案
鉴于数据库中的以下事实:
我想收集所有具有最小第二个参数的第一个参数,加上第二个参数的值。第一次尝试:
而不是setof/3
,我可以使用aggregate/3
:
注意
如果我正在寻找数字的最小值,这只会给出相同的结果。如果涉及算术表达式,结果可能会有所不同。如果涉及非数字,aggregate(min(...), ...)
将抛出错误!
或者,相反,我可以使用完整的键排序列表:
最后,对于问题:
我可以直接使用库(聚合)吗?感觉应该是可以的......
或者是否有
std::partition_point
来自 C++ 标准库的谓词?还是有一些更简单的方法可以做到这一点?
编辑:
为了更具描述性。假设有一个(库)谓词partition_point/4
:
(我不喜欢这个名字,但我们现在可以忍受)
然后: