递归谓词的例子

Posted

技术标签:

【中文标题】递归谓词的例子【英文标题】:Examples of recursive predicates 【发布时间】:2021-12-12 07:30:27 【问题描述】:

在 Stone 的 Algorithms for Functional Programming 中,他给出了递归定义谓词的设计模式,在 Scheme 中是

(define (check stop? continue? step)
  (rec (checker . arguments) 
    (or (apply stop? arguments) 
        (and (apply continue? arguments) 
             (apply (pipe step checker) arguments)))))

其中pipe 是作者按图解顺序组合两个函数的函数((pipe f g) x = (g (f x))

因此,例如,要测试一个函数是否是 2 的幂,您可以定义

(define power-of-two? (check (sect = <> 1) even? halve))

其中(sect = &lt;&gt; 1) 是作者的柯里化符号,相当于lambda x: x == 1

很明显,很多谓词可以递归实现,但它不会有用。显然有些递归谓词不会使用这种模式,比如树上的谓词。

有哪些经典的谓词适合这种模式?我想测试一下康托集中是否有东西,但这和上面的几乎一样。

【问题讨论】:

这个问题似乎更适合Computer Science。 【参考方案1】:

不清楚您在问什么,但您的示例是使用组合器进行编程的经典示例。

组合子是作为输入函数和返回函数的函数。

组合器是函数式编程的基础。使用它们,您可以实现一切。例如,如果您将对象的数据结构定义为函数,您可以使用组合器组合对象并获取新对象。

您示例中的组合子似乎有助于检查有关某些单子组成的某些谓词。

【讨论】:

以上是关于递归谓词的例子的主要内容,如果未能解决你的问题,请参考以下文章

Prolog:递归无法正常工作

matlab 递归调用例子

递归算法及经典递归例子代码实现

递归例子大全(持续更新)

递归迭代和分治:递归的典型例子

递归思维的算法是啥? (关于具体例子)