问题标签 [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 运算符预期错误
我在堆栈溢出时搜索了 Prolog Operator 预期的错误问题,但是我无法识别我得到的错误:
代码很简单:
lambda - 是否可以将 maplist/3 与“匿名”谓词一起使用?
例如,我希望使用 maplist/3 实现的可能是以下伪代码:
我知道可以写例如
所以我可以将伪代码定义lambda X: Z/Y=X, to_lower(Z,LC), char_code(L,LC), return L/Y
为普通谓词并在映射列表中使用这个谓词......
但是,我很好奇是否可以在不创建全新谓词的情况下做到这一点?
我之所以要这样做,是因为我觉得阅读起来更自然,而不是在代码中跳来跳去寻找谓词
prolog - 路径/小径/步行的定义
许多谓词定义了某种从通过二元关系定义的边构建的非循环路径,与定义传递闭包非常相似。因此需要一个通用的定义。
请注意,图论中定义的概念并不容易与通常预期的相匹配。最值得注意的是,我们对边缘的名称不感兴趣。
更糟糕的是,图论也发生了一些变化,引入了walk的概念,注意到
传统上,路径指的是现在通常称为开放式步行的路径。如今,当没有任何限定的情况下,路径通常被理解为简单,这意味着没有顶点(因此没有边)重复。(术语链也被用来指代所有顶点和边都不同的游走。)
所以我的问题是:如何命名和定义这个功能?
到目前为止我所做的是定义:
第一个论点必须是关系的延续,这是一个不完整的目标,缺少两个进一步的论点。然后是Path
顶点或顶点对。
示例用法
执行
prolog - Prolog 绑定参数
在 sicstus prolog 中,有一个谓词:
Pred
应该只接受一个参数 -List
元素。如何通过定义第一个参数的 2 参数谓词?在其他语言中,它会写成:
module - 传递给库元谓词的目标模块扩展
使用SWI-Prolog(多线程,64 位,版本 7.3.5),我们一步一步进行:
在模块中定义dcg非终结符(发音:“ di-SEE-goh ”):
/li>a//1
dcgAux
运行以下查询 - 使用
phrase/2
andapply:foldl/4
:нет!相当惊喜——而且不是一个好惊喜。我们是否错过了一些未知的未知数?
为了摆脱上述恼人的行为,我们必须首先找出导致它的原因:
/li>
这是怎么回事?我的看法是这样的:
- 传递给目标的模块扩展
foldl/4
是有限的。 引用SWI-Prolog 手册页
import_module/2
:所有普通模块仅从用户导入,从系统导入。
SWI 的
library(apply)
唯一“继承”自system
,但不是user
。如果我们将模块克隆
/li>apply
到applY
(并传播新的模块名称),我们观察到:
请分享您对我可以/应该如何进行的想法!
(我还没有对其他 Prolog 处理器进行过类似的实验。)
count - 将 Prolog 目标作为输入放在第一个参数位置,并返回此目标在第二个参数位置成功的次数
正如标题所说,我想编写一个执行此操作的程序。
一个例子是:
但不仅适用于内置成员,还适用于一些运算符,例如:
有人可以帮我开始吗?
lambda - 从 Prolog 中调用执行的主体检索输出
假设我们有一个谓词p/2
做类似的事情:
p/2
做一些任意复杂的事情,最后把一些结果放在 OutputList 中。
假设我需要将谓词的主体p/2
放在一个列表中:
Body = [some_predicate_1,...,findall(...,...,OutputList)]
并且我想执行它。
如果我做类似的事情call(Body)
,我该如何检索OutputList
?
我可以使用其他谓词吗?
也许call/1
或call/2
不适合这个目的。
prolog - maplist/3 的 DCG 版本
以下元谓词通常很有用。请注意,它不能被调用maplist//2
,因为它的扩展会与maplist/4
.
这里有几个问题。当然是名字。还有终端[B]
:是否应该明确断开与连接目标的连接?
如果没有上述定义,则必须编写以下任一内容 - 两者都有严重的终止问题。
prolog - `foldl1/3` 和 `foldr1/3` 元谓词在空列表上的行为
寻求建议。我正在向Logtalk 库添加元谓词foldl1/3
。foldr1/3
这些可以很容易地定义:
使用这些定义,使用空列表调用元谓词就会失败。但这不允许区分由于闭包失败构造的隐式目标之一导致调用失败的情况。
如果您设想自己使用这些元谓词,您是否发现空列表上的失败是一种可接受的行为,或者您更愿意在这种情况下生成异常?
prolog - Prolog 高阶归约谓词
我们可以将高阶映射谓词定义为:
同样,我们可以将折叠(左)定义为:
reduce(左)的正确定义是什么?我们可以这样定义吗?
和reduceback(右)如下?
这些是正确的吗?