所有
以下是我发现很难减少的lambda表达式,即我无法理解如何解决这个问题。
(λmλnλaλb.m(n a b)b)(λfx.x)(λfx。f x)
这是我试过的,但我被困住了:
将上述表达式视为:(λm.E)M等于
E =(λnλaλb.m(n a b)b)
M =(λfx.x)(λfx。f x)
=> (λnλaλb。(λfx.x)(λfx。f x)(n a b)b)
将上述表达式视为(λn.E)M等于
E =(λaλb。(λfx.x)(λfx。f x)(n a b)b)
M = ??
..我迷路了!!
任何人都可以帮助我理解,对于任何lambda演算表达式,执行缩减的步骤应该是什么?
答案 0 :(得分:19)
您可以按照以下步骤减少lambda表达式:
(λX. e1) e2
的出现,其中X
可以是任何有效标识符,e1
和e2
可以是任何有效的表达式。< / LI>
(λx. e1) e2
替换为e1'
来应用此功能,其中e1'
是用x
替换e1
中e2
的每一次自由出现的结果((λ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))
并获取:
{{1}}
现在我们已经完成了。
答案 1 :(得分:4)
你出错的地方是,在第一步,你不能有
M = (λf x. x)(λ f x. f x)
因为原始表达式不包含该应用程序表达式。为了清楚说明,你可以在应用程序是左关联的规则之后放入隐式括号(使用[和]表示新的parens并输入一些缺失的“。”):
[ (λm . λn . λa . λb . m (n a b) b) (λ f x. x) ] (λ f x. f x)
从此处,在(λv.E) M
内找到v
形式的表达式,并将M
替换为E
中的N (λv.E) M
来减少它。小心它真的是M的功能应用:如果你有类似的东西就不是
( (λm . λn . λa . [λb . m (n a b) b]) (λ f x. x) ) (λ f x. f x)
,从那时起N被应用于函数,M被应用为两个参数。
如果你仍然卡住,请尝试为每个lambda加入parens - 基本上是一个新的“(每个”之后“。”和匹配的“)”尽可能地向右移动,同时仍然匹配新的“(”。作为一个例子,我在这里做了一个(用[和]使它们脱颖而出):
{{1}}
答案 2 :(得分:0)
只需用一个事物替换它对应的事物:
(λm λn λa λb . m (n a b) b) (λ f x. x) (λ f x. f x)
= ~ ^________ ~~~~~~~~~~
(λn λa λb . (λ f x. x) (n a b) b) (λ f x. f x)
= ~ ^__________ ~~~~~~~~~~~~
(λa λb . (λ f x. x) ((λ f x. f x) a b) b)
= ~ ~~~~~~~~~~~~~~~~~~
(λa λb . (λ x. x) b)
= ~ ^ ~
(λa λb . b )
仅此而已。