gpt4 book ai didi

prolog - Prolog中的`if_/3`运算符的目标扩展

转载 作者:行者123 更新时间:2023-12-01 14:46:51 24 4
gpt4 key购买 nike

我正在编写一个标记器,我想使用 if_/3 在我的代码中保留

该代码看起来像左侧的以下代码1-但我希望它看起来像右侧的代码。

if_(Cond1_1,%(Cond1_1
然后1,%* =>然后1
if_(Cond2_1,%; Cond2_1
然后2,%* =>然后2
if_(Cond3_1,%; Cond3_1
然后3,%* =>然后3
if_(Cond4_1,%; Cond4_1
然后4,%* =>然后4
if_(Cond5_1,%; Cond5_1
然后5,%* =>然后5
其他5%;其他5
))))。 %)。

为了在SWI-Prolog中将(*=>)/2重写为if_/3,我想到了:

:-op(1050,xfy,* =>)。

:-多文件Goal_expansion / 2。
Goal_expansion((Cond * => Then; Else),if_(Cond,Then,Else))。
Goal_expansion(Cond * =>然后,(call(Cond,true),call(Then)))。

“做完了。”我想。

但是在阅读了SWI-Prolog documentation for goal_expansion/2 之后我感到怀疑:

只有在读取源文件时出现在子句主体中的目标才使用此机制进行扩展,并且仅当目标在字面上出现在子句中或作为已定义元谓词的自变量(使用'0'注释)时可见(请参见meta_predicate / 1)。其他情况需要一个真实的谓词定义。

所以这是我的实际问题:我也需要一个真正的谓词定义吗?

脚注1 :实际代码具有更长的else if链。

最佳答案

您需要一个if_ / 3谓词定义,至少要赋值
它是一个元谓词声明,否则扩展将停止,
如果if_ / 3本身没有元谓词声明。

您可以尝试一下,我仅使用此扩展:

:- op(1050,xfy,*=>).
:- multifile goal_expansion/2.
goal_expansion((Cond *=> Then ; Else), if_(Cond,Then,Else)).

没有元谓词声明:
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.4)

?- expand_goal((a *=> b; c *=> d; e), X).
X = if_(a, b, (c*=>d;e)).

使用元谓词声明:
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.4)

:- meta_predicate if_(1,0,0).
?- expand_goal((a *=> b; c *=> d; e), X).
X = if_(a, b, if_(c, d, e)).

在SWI-Prolog和Jekejeke Prolog中,这是相同的行为。您可以研究源代码以更好地理解为什么需要元谓词声明。

参见示例:
https://github.com/jburse/jekejeke-devel/blob/master/jekrun/headless/jekpro/frequent/standard/expand.p#L220

关于prolog - Prolog中的`if_/3`运算符的目标扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55404139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com