Prolog中两个执行偶数和奇数的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog中两个执行偶数和奇数的区别相关的知识,希望对你有一定的参考价值。

我有两个Prolog的实现,函数是决定给定的数字是奇数还是偶数

第一个正常工作

even1(0).
even1(X) :- X>0 ,X1 is X-1, odd1(X1).

odd1(1).
odd1(X) :- X>1 , X1 is X-1, even1(X1).

even1(2)返回true

但第二个不能正常工作

even2(0).
even2(X) :- X>0 , odd2(X-1).

odd2(1).
odd2(X) :- X>1 , even2(X-1).

even2(2)返回false可以有人向我解释什么是两者之间的区别?

答案

Prolog是一种关系语言,而不是一种功能语言。因此,当您调用odd2(X-1)时,谓词参数X-1不会被计算为表达式,而是被解释为复合词:

?- functor(X-1, Name, Arity).
Name =  (-),
Arity = 2.

您可以检查Prolog通过使用系统跟踪功能证明查询时会发生什么:

?- trace.
true.

[trace]  ?- even2(2).
   Call: (8) even2(2) ? creep
   Call: (9) 2>0 ? creep
   Exit: (9) 2>0 ? creep
   Call: (9) odd2(2-1) ? creep
   Call: (10) 2-1>0 ? creep
   Exit: (10) 2-1>0 ? creep
   Call: (10) even2(2-1-1) ? creep
   Call: (11) 2-1-1>0 ? creep
   Fail: (11) 2-1-1>0 ? creep
   Fail: (10) even2(2-1-1) ? creep
   Fail: (9) odd2(2-1) ? creep
   Fail: (8) even2(2) ? creep
false.

请注意,表达式2-1-1的计算结果为零,但是,作为一个复合项,调用even2(2-1-1)不会与谓词even2(0)的基本情况统一:

?- even2(2-1-1) = even2(0).
false.

?- 2-1-1 = 0.
false.

因此,Prolog尝试第二个子句,并且调用最终未通过X>0检查。注意>/2,作为算术比较谓词,它确实在实际比较之前评估它的参数。

以上是关于Prolog中两个执行偶数和奇数的区别的主要内容,如果未能解决你的问题,请参考以下文章

php中:计算任意一维数字数组的奇数个数、偶数个数?代码怎么写.

问一下100以内的奇数和偶数分别相加起来和是多少?

JAVA从键盘中输入20个整数将奇数和偶数存入不同的两个数组中 计算这两个数组中所有数据之和

经典面试题——两个线程交替打印奇数和偶数

将一个数组拆分为两个数组,一个为奇数数组,一个为偶数数组

python利用循环计算50到100中奇数的和和偶数的和?