Zap*_*Zap 4 if-statement prolog
我正在试验Prolog并试图制作我自己的" if-then-else"方法,所以我不使用这种-> ;方法,为了试验而做.我的目标是使它在我的代码中可以嵌套ifs和elses(如果需要).到目前为止,我有这个:
ifthenelse(_, G, G):- G. %no matter the condition, the goals are the same
ifthenelse(true,G,_):- G. %if
ifthenelse(false,_,G):- G. %else
Run Code Online (Sandbox Code Playgroud)
我认为我的方式似乎不太正确.我怎样才能做好自己的事ifthenelse/3?
谢谢
前言:你所实现的是一个重要的方面,比你提到的内置构造要好得多.我将在下面更详细地讨论这一点.
关于字面问题:我认为你已经非常接近了,因为你已经可以在某种程度上嵌套它了:
?- ifthenelse(C1, ifthenelse(C2,X=1,X=2), X=3). C1 = C2, C2 = true, X = 1 ; C1 = true, C2 = false, X = 2 ; C1 = false, X = 3.
现在剩下的就是让它在这种情况下可以嵌套.对于这一点,你需要一种方法来具体化条件的结果,就是把真值成Prolog的 术语,你可以象征性地推理.
有关if_/3更多信息,请参阅:索引dif/2
此构造保留的关键属性称为逻辑纯度.特别是,如果逻辑上都可以,则不要错误地提交到一个分支!
关于纯度的注意事项:从声明的角度来看,您实施的内容非常好,并且具有清晰的逻辑解释.以最后两个子句为例,我们可以读ifthenelse(C,G1,G2)作:如果 C是true,则谓词保持G1不变.如果C是false,那么如果成立则G2持有.非常好.语义"if ... then"在任何方面都没有问题; 事实上,每个单独的Horn子句都可以这种方式阅读,从右到左是一个含义.
相比之下,你提到的内置结构通常缺乏这样的声明性读数.例如:
?- ( ( X = 1 ; X = 2 ) -> true ; true ). X = 1.
但另一方面:
?- X = 2, ( ( X = 1 ; X = 2 ) -> true ; true ). X = 2.
因此添加约束导致了一种新的解决方案.古典逻辑学家的噩梦.
您的构造避免了这样的问题,因为它不会过早地提交到任何特定的分支.这产生了一个更通用的谓词,也可以用于其他方向.例如,看到正确生成所有可能的解决方案:
?- ifthenelse(C, true, true). true ; C = true ; C = false.
因此,我非常鼓励你制定这个方法:正如你已经非常清楚地表明,它是你自己的 'if-then-else',并且你只使用纯粹的单调构造来表达它.
从心理学的角度来看,我通常更愿意为纯粹的陈述性结构提供更多的空间,我之所以添加本节只是因为这些评论表达了对这些方面的真正兴趣.