如何在lambda演算中编码

时间:2016-08-12 18:20:59

标签: haskell lambda semantics lambda-calculus

我正在Haskell学习lambda演算,在此期间,我遇到了这个问题。

enter image description here

这些问题的解决方案是:

enter image description here

但我无法理解他们如何得出答案。 就像eq一样,我不明白他们是如何做到这一点的:λab.a b (b (λxy.y) (λxy.x))  同样适用于nand。如果有人解释并帮助我理解这个问题,那将是非常好的。

谢谢。

2 个答案:

答案 0 :(得分:7)

让我们先用实际数据类型编写有问题的函数(但没有模式匹配:仅if / then / else):

data Bool = False | True -- recall this definition
not  a   = if a then False else True
eq   a b = if a then (if b then True  else False)
                else (if b then False else True )
nand a b = if a then (if b then False else True )
                else (if b then True  else True )

如果您购买这些定义 - 这些定义非常简单,只需列出函数的真值表 - 那么我们就可以开始做一些推理了。首先,我们可以稍微简化eqnand函数的外部分支:

eq   a b = if a then b else not b
nand a b = if a then not b else True

现在我们基本完成了。我们只需用False / True / if行为替换每个thenelse,并替换每个if / then带有函数应用程序的/ else

type Bool a = a -> a -> a
false a b = a -- `if False then a else b` becomes `false a b`
true  a b = b -- `if True  then a else b` becomes `true  a b`

not  a   = a false true   -- from `if a then False else True`
eq   a b = a b (not b)    -- from `if a then b else not b`
nand a b = a (not b) true -- from `if a then not b else True`

这些是您的解决方案中给出的定义,但不可否认的是Haskell语法而不是lambda演算语法。

答案 1 :(得分:4)

我正在使用Haskell将λ写为posts

从评论中看来,您在使用此部分时遇到了问题:

\

所以我只关注这个。

我们对布尔值的编码是带有两个参数的函数。 eq = \a b. a b (b (\x y. y) (\x y. x)) 返回第一个参数,True返回第二个参数。第一段直接给出了编码:

False

我们将使用名称而不是lambda表达式直到最后。

我们知道True = \x y. x False = \x y. y 应该采用两个论点,即两个布尔值进行比较。 (布尔值的编码本身有两个参数,但这是不同的 - eq应该采用两个参数,无论布尔值如何编码)所以我们知道它应该是这样的:

eq

在这一点上,我们唯一可以做的就是检查其中一个参数,以确定它是eq = \a b. _________________ 还是TrueFalse是对称的,所以我们要问哪一个并不重要;让我们毫无理由地选择eq。根据编码,我们要求的方法是将两个参数传递给我们想要找到的东西。

a

我们尚未弄清楚“洞”中的内容。第一个洞是eq = \a b. a ____ ____ 原来是a时将返回的内容,第二个洞是True后将返回的内容。

为了弄清楚如何填补这些漏洞,让我们为我们想要定义的内容编写真值表:

False

请注意,在a | b | eq a b ------+-------+--------- True | True | True True | False | False False | True | False False | False | True a的两行中,True列与a == b列完全相同。因此,当ba时,我们只返回True。所以我们可以填补其中一个漏洞:

b

现在在表格中注意,当eq = \a b. a b ____ a时,Falsea == b列相反,因此在这种情况下我们应该反转b并将其归还。

要反转b,我们希望bFalse时为b,反之亦然。在编码中,即:

True

这就是b False True a时我们应该返回的内容,所以我们填写另一个洞:

False

现在我们只展开eq = \a b. a b (b False True) False

的定义
True

你有它。