【发布时间】:2017-02-11 12:03:15
【问题描述】:
谓词 if_/3 似乎是 fairly popular 在 Stack Overflow 的 Prolog 部分中为数不多的主要贡献者之一。
这个谓词是这样实现的,感谢@false:
if_(If_1, Then_0, Else_0) :-
call(If_1, T),
( T == true -> call(Then_0)
; T == false -> call(Else_0)
; nonvar(T) -> throw(error(type_error(boolean,T),_))
; /* var(T) */ throw(error(instantiation_error,_))
).
但是,我一直无法找到一个清晰、简单和简洁来解释这个谓词的作用,以及它与例如Prolog if -> then ; else 的经典 if-then-else 构造。
我发现的大多数链接都直接使用这个谓词,并且几乎没有解释为什么要使用它,非 Prolog 专家可以很容易地理解。
【问题讨论】:
-
您需要成为 Prolog 以外的专家才能理解这一点;-) 神秘的名称也无济于事。请记住,第一个参数不能只是任何东西:它必须是一个确定性成功的谓词,并将其第二个参数与
true或false(“reification”)统一起来,否则会引发错误。 -
PS:我并不是说它不是一个有用的谓词,但它的意义远不止我们看到的。将丑陋隐藏在间接层之下是您所说的“少数主要贡献者”所提倡的 Prolog 编程风格的一个共同特征。我希望我不会觉得自己太消极,我确实认为拥有这样的结构并尝试将它们应用于现有的和新的问题是一件好事。
-
PPS:特别是,研究
=/3的定义,在if_/3、from your own link 的正下方,您会看到如何编写一个与if_/3配合得很好的谓词。 -
D'abord,你读过arxiv.org/abs/1607.01590吗?
-
@Fatalize 公平地说,那篇论文中有很多代码,文本只是提供了必要的上下文。
标签: if-statement prolog logical-purity