如果是奇数,则”返回” 0,如果是偶数,则”返回”相同的值

“Return” 0 if odd and same value if even in prolog

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

我想要类似的东西:

1
pair(X,Y)

像这样工作:

1
2
3
4
5
6
7
?- pair(4,Y).

Y = 4,

?- pair(3,Y).

Y = 0,

但是我真的不知道该怎么做。我知道您可以使用类似X mod 2 =:= 0的对或错,但我不知道如何以prolog的方式编写" if this than that"代码。


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

1)做出几条陈述,针对您要考虑的每种情况陈述一条,然后让Prolog执行机制找到合适的陈述:

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

在第二种情况下,统一是隐式的,但在第一种情况下,是显式的。

_符号是"匿名变量"的语法糖,该变量是我们不关心且不使用其绑定的变量。

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

1
2
3
4
5
6
7
8
% 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构造:

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

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

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

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

Condition参数中不允许剪切。