Prolog中的后继功能

时间:2014-03-18 11:46:51

标签: prolog successor-arithmetics

在我最近在逻辑编程的大学水平考试中遇到的一个问题中,我被要求编写一个Prolog谓词odd/1,用于确定给定值是否为奇数。

该实现应该使用已经给定的谓词s/1,它将评估给定元素的后继(即X + 1)。 这是实现odd/1谓词的解决方案:

odd(s(0)):-!. % 1 is the first odd number
odd(s(s(X))):- odd(X). % A number s(s(X)) (i.e X + 2) is odd if X is odd as well
  1. 第一个表达式中的!是否实际用于任何目的?我知道在此之后它会阻止回溯,但是没有以下表达式?这是否意味着解析算法此时只是停止了?
  2. 为了练习,我试图实现s/1后继谓词,但是无法这样做。 (如何)可以在Prolog中实现这个谓词吗?

1 个答案:

答案 0 :(得分:1)

这里是没有剪切的痕迹

[trace] 21 ?- odd(s(s(s(0)))).
   Call: (6) odd(s(s(s(0))))
   Call: (7) odd(s(0))
   Exit: (7) odd(s(0))
   Exit: (6) odd(s(s(s(0))))
true ;
   Redo: (7) odd(s(0))
   Fail: (7) odd(s(0))
   Fail: (6) odd(s(s(s(0))))
false.

这里有剪切

[trace] 22 ?- odd(s(s(s(0)))).
   Call: (6) odd(s(s(s(0))))
   Call: (7) odd(s(0))
   Exit: (7) odd(s(0))
   Exit: (6) odd(s(s(s(0))))
true.

我认为已经增加了效率......

关于s / 1,它不是谓词,而是数据结构。也许你已经看过像

这样的东西
integer(0).
integer(s(X)) :- integer(X).

这实际上是(正)整数

的无限域的最简单的递归定义