您可以按照以下步骤减少 lambda 表达式:
- 将表达式完全括起来以避免错误并使函数应用发生的位置更加明显。
- 查找函数应用程序,即查找可以是任何有效标识符并且可以是任何有效表达式的模式
(λX. e1) e2
的出现。X
e1
e2
(λx. e1) e2
通过替换来应用函数e1'
where是将ine1'
的每个自由出现替换为 的结果。x
e1
e2
- 重复 2 和 3,直到模式不再出现。请注意,这可能会导致非规范化表达式的无限循环,因此您应该在 1000 次左右迭代后停止;-)
因此,对于您的示例,我们从表达式开始
((λm. (λn. (λa. (λb. (m ((n a) b)) b)))) (λf. (λx. x))) (λf. (λx. (f x)))
这里的子表达式(λm. (λn. (λa. (λb. (m ((n a) b)) b)))) (λf. (λx. x))
符合我们的模式X = m
,e1 = (λn. (λa. (λb. (m ((n a) b)) b))))
和e2 = (λf. (λx. x))
。所以在替换之后我们得到(λn. (λa. (λb. ((λf. (λx. x)) ((n a) b)) b)))
,这使得我们的整个表达式:
(λn. (λa. (λb. ((λf. (λx. x)) ((n a) b)) b))) (λf. (λx. (f x)))
X = n
现在我们可以使用,e1 = (λa. (λb. ((λf. (λx. x)) ((n a) b)) b))
和将模式应用于整个表达式e2 = (λf. (λx. (f x)))
。所以代入后我们得到:
(λa. (λb. ((λf. (λx. x)) (((λf. (λx. (f x))) a) b)) b))
现在((λf. (λx. (f x))) a)
符合我们的模式并变为(λx. (a x))
,这导致:
(λa. (λb. ((λf. (λx. x)) ((λx. (a x)) b)) b))
这一次我们可以将模式应用到((λx. (a x)) b)
,这减少到(a b)
,导致:
(λa. (λb. ((λf. (λx. x)) (a b)) b))
现在将模式应用到((λf. (λx. x)) (a b))
,它减少到(λx. x)
并得到:
(λa. (λb. b))
现在我们完成了。