是否有可能在无类型lambda演算上有效地实现`max`?

Mai*_*tor 7 functional-programming lambda-calculus caramel

min通常在无类型lambda演算上定义为(使用Caramel的语法):

sub a b   = (b pred a)
<=  a b   = (is_zero (sub b a))
min a b   = (<= a b a b)
Run Code Online (Sandbox Code Playgroud)

这非常低效.Sub是二次的,因为它适用pred(这是线性的)b时间.有一个更有效的实现min:

min a b succ zero = (a a_succ (const zero) (b b_succ (const zero))))
    a_succ pred cont = (cont pred)
    b_succ pred cont = (succ (cont pred))
Run Code Online (Sandbox Code Playgroud)

这将以延续传递方式切换两个数字,直到达到第一个零.现在,我正在尝试找到一个max效率高的min,具有以下属性:

  1. a并且b在函数体上最多使用一次.

  2. 它具有β正常形式(即,不使用定点组合器强烈正常化).

这样的max定义是否存在?

Mai*_*tor 1

仅供记录,如果ab可以使用两次(即,它将涉及dup交互网上的节点),有一个简单的解决方案:

true a b  = a
false a b = b
const a b = a

-- less than or equal
lte a b = (go a true (go b false))
    go  = (num result -> (num (pred cont -> (cont pred)) (const result)))

min  = (a b -> (lte a b a b))
max  = (a b -> (lte a b b a))

-- A simple test
main = (max (max 3 14) (max 2 13))
Run Code Online (Sandbox Code Playgroud)

但我要求不重复(即lte a b b a不允许),所以我仍然不知道这是否可能。