首页 文章

Prolog中的后继功能

提问于
浏览
2

在我最近在逻辑编程的大学水平考试中遇到的一个问题中,我被要求编写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中实现这个谓词?

1 回答

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

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

相关问题