在我最近在逻辑编程的大学水平考试中遇到的一个问题中,我被要求编写一个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
!
是否实际用于任何目的?我知道在此之后它会阻止回溯,但是没有以下表达式?这是否意味着解析算法此时只是停止了?s/1
后继谓词,但是无法这样做。 (如何)可以在Prolog中实现这个谓词吗?答案 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).
这实际上是(正)整数
的无限域的最简单的递归定义