我正在编写一个标记器,我想用它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
toif_/3
我想出了:
:- op(1050,xfy,*=>)。 :- 多文件目标扩展/2。 目标扩展((Cond *=> Then ; Else), if_(Cond,Then,Else))。 目标扩展(Cond *=> Then,(调用(Cond,true),调用(Then)))。
“完成了,”我想……
但是在阅读了SWI-Prolog 文档goal_expansion/2
后,我开始怀疑:
只有在读取源文件时出现在子句主体中的目标才会使用这种机制进行扩展,并且仅当它们按字面意思出现在子句中时,或者作为使用 '0' 注释的已定义元谓词的参数时(参见 meta_predicate/ 1)。其他情况需要一个真正的谓词定义。
所以这是我的实际问题:我是否也需要一个真正的谓词定义?
脚注 1:实际代码有更长的else if
s 链。