1

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

该实现应该使用已经给定的 predicate 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 中实现这个谓词吗?
4

1 回答 1

0

这是没有切割的痕迹

[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).

这实际上是(正)整数的无限域的最简单的递归定义

于 2014-03-18T13:43:45.503 回答