Prolog - 自定义'if-then-else'

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

谢谢

mat*_*mat 6

前言:你所实现的是一个重要的方面,比你提到的内置构造要好得多.我将在下面更详细地讨论这一点.

关于字面问题:我认为你已经非常接近了,因为你已经可以在某种程度上嵌套它了:

?- 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)作:如果 Ctrue,则谓词保持G1不变.如果Cfalse,那么如果成立则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',并且你只使用纯粹的单调构造来表达它.

从心理学的角度来看,我通常更愿意为纯粹的陈述性结构提供更多的空间,我之所以添加本节只是因为这些评论表达了对这些方面的真正兴趣.