问题标签 [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 - 自定义 DCG 运算符
假设我想编写一个自定义运算符来以一种重复的方式组成 DCG 规则。
例如,假设我有一个 DCG,ws
这样:
匹配零个或多个空格。显然,如果我想要语法中每个标记之间的可选空格,那么必须把它放在, ws
任何地方都是令人讨厌的。
我可以定义一个新的运算符来替换,/2
.
--/2
这通过可选的空白规则连接了左右手。这大部分都可以正常工作,但是某些事情会出错:
如果我尝试执行此规则,则会收到一条错误消息,指出;/4
未定义。我对这里的问题有一个模糊的想法,但基本上问题是:有没有一种方法可以为 DCG 定义新的运算符,其通用性与,/2
?
prolog - 如何在序言中将谓词指定为另一个谓词的参数?
如果作为第一个参数出现的谓词对于出现在第二个参数中的列表的所有元素都成立,我想编写一个序言谓词。这是我尝试过的东西:
类似以下的内容应该返回 true。这在 Prolog 中可能吗?
prolog - 具体化 call_with_time_limit / call_with_inference_limit
我正在尝试callto_status(Goal, Status)
根据调用的结果定义一个始终成功并统一 Status的关系Goal
(换句话说,我想实现一个具体化的版本call_with_inference_limit/3
)。call_with_inference_limit/3
我的实现使用具有相同接口的SWI call_with_time_limit/3
(在这种情况下也应该可以工作)。的实施call_with_..._limit
不会回溯,所以我认为最好不要给人以报告答案替代目标的印象。
我介绍了辅助谓词derivable_st
以提高可读性。它处理成功和超时情况,否则失败。
主要谓词环绕derivable_st
并处理失败情况和可能抛出的异常(如果有的话)。我们可能想要找出堆栈溢出(在推理限制太高的情况下发生),但现在我们只报告任何异常。
谓词适用于一些简单的测试用例:
我现在的问题有点含糊:这个谓词是否像我声称的那样做?您是否看到任何错误/改进点?我很感激任何意见!
编辑:正如@false 所建议的,注释掉了copy_term/2
macros - 测试元谓词映射表的目标扩展
问:我们怎样才能摆脱SICStus Prolog中的maplist
开销(如 SWI 的开销) ?apply_macros
A:目标扩展。
首先,我们定义我们需要的辅助谓词。下面我们使用 SICStus Prolog 4.5.0。
现在进入目标扩展:
到目前为止一切都很好;)所以这就是问题所在......
如何确保目标扩展变体与它替换的谓词完全相同?
(我有一种预感,它不是,但我不能完全确定它......)
简单示例用例 #1
变成
prolog - Prolog 中 `if_/3` 运算符的目标扩展
我正在编写一个标记器,我想用它if_/3
来保持我的代码中的逻辑纯度。
代码看起来像下面左边的代码1,但我希望它看起来像右边的代码。
为了在 SWI-Prolog 中重写(*=>)/2
toif_/3
我想出了:
“完成了,”我想……
但是在阅读了SWI-Prolog 文档goal_expansion/2
后,我开始怀疑:
只有在读取源文件时出现在子句主体中的目标才会使用这种机制进行扩展,并且仅当它们按字面意思出现在子句中时,或者作为使用 '0' 注释的已定义元谓词的参数时(参见 meta_predicate/ 1)。其他情况需要一个真正的谓词定义。
所以这是我的实际问题:我是否也需要一个真正的谓词定义?
脚注 1:实际代码有更长的else if
s 链。
prolog - foldl1 的 Prolog 实现
我正在尝试在 prolog 中实现 foldl1 而不使用内置 foldl 谓词。
我的代码产生Syntax error: Operator expected
:
我预计:
谢谢!
prolog - 在不多次使用 call_nth/2 或使用 findall/3 的情况下找到所需的解决方案?
据我了解, call_nth(:Goal, ?Nth) 返回 Goal 的第 N 个解决方案,但同时它秘密计算所有先前的解决方案(从第一个到第 (N-1) 个)并简单地忽略它们。如果我们希望将 1 到 N-1 之间的每个 X 的第 X 个解与第 (X+1) 个解进行比较,那么 call_nth 变得非常昂贵,因为它基本上一直在计算前面步骤中已经计算过的解。我想知道是否有更有效的方法来解决这种形式的问题,当然不使用 findall/3。
(一个典型的例子是下面的脚本,如果谓词中不存在 GOAL,它会找到 GOAL 或最接近的最大值。)
prolog - Prolog 中的 map 函数等价于什么?
如果我有一个列表,并且想要生成一个列表,其中包含由“函数”转换的所有项目,例如,相当于 Lisp 的
我如何在 Prolog 中做同样的事情?
prolog - 检查列表的所有成员
假设我的序言中有以下列表:
有没有一种方法可以检查列表的所有成员L
以确保每个成员都小于5
?
prolog - 过滤器关联表序言
我需要编写 include_assoc / 3 谓词,用给定的谓词(第一个参数)过滤关联数组(第二个参数)并将结果写入第三个参数。谓词应该类似于包含 / 3。过滤谓词应该使用键值对作为参数。
我无法在过滤之前将表格更改为列表。我该怎么做?
我的代码