即使在prolog

时间:2017-04-26 23:24:56

标签: prolog

我是prolog的新手,所以统一的概念仍然是新的,所以请耐心等待。

我想要类似的东西:

pair(X,Y)

就是这样:

?- pair(4,Y).

Y = 4,

?- pair(3,Y).

Y = 0,

但我真的不知道该怎么做。我知道你可以使用像X mod 2 =:= 0这样的东西,无论是真还是假,但我不知道如何用prolog的方式制作“if this than than”代码。

1 个答案:

答案 0 :(得分:0)

除了使用CLPFD(有限域上的约束逻辑编程)之外,还有几种方法可以在Prolog中表达条件语句:

1)制作几个陈述,每个案例对应一个你正在考虑,并让Prolog执行机制找到合适的陈述:

pair(X,Y) :- even(X), !, Y = X. % 'if X is even then Y = X'
pair(_,0).                      % 'else Y = 0'

在第二种情况下,统一是隐含的,但在第一种情况下它是明确的。

_符号是'匿名变量的语法糖,这是我们不关心的绑定变量,我们不使用它。

在第一个子句中使用 cut运算符 !告诉Prolog如果第一个子句成功,它不应该尝试为Y找到其他解决方案(如,回溯并尝试第二个条款):

% without cut                         | % with cut
?- pair(4,Y).                         | ?- pair3(4,Y).
                                      |
Y = 4 ? ;                             | Y = 4 ? ;
                                      |
Y = 0 ? ;  % <- wrong behaviour!      | no.
                                      |
no                                    |

2)使用(Condition -> ThenStatement ; ElseStatement) if-then-else结构:

pair(X,Y) :- (even(X) -> Y = X ; Y = 0).

Condition参数中不允许剪切。使用Condition的第一个解决方案。

3)某些系统具有if/3谓词,评估为if(Condition,ThenStatement,ElseStatement)

pair(X,Y) :- if( even(X), Y = X, Y = 0).

Condition参数中不允许剪切