我正在Haskell学习lambda演算,在此期间,我遇到了这个问题。
这些问题的解决方案是:
但我无法理解他们如何得出答案。
就像eq一样,我不明白他们是如何做到这一点的:λab.a b (b (λxy.y) (λxy.x))
同样适用于nand。如果有人解释并帮助我理解这个问题,那将是非常好的。
谢谢。
答案 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 )
如果您购买这些定义 - 这些定义非常简单,只需列出函数的真值表 - 那么我们就可以开始做一些推理了。首先,我们可以稍微简化eq
和nand
函数的外部分支:
eq a b = if a then b else not b
nand a b = if a then not b else True
现在我们基本完成了。我们只需用False
/ True
/ if
行为替换每个then
和else
,并替换每个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. _________________
还是True
。 False
是对称的,所以我们要问哪一个并不重要;让我们毫无理由地选择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
列完全相同。因此,当b
为a
时,我们只返回True
。所以我们可以填补其中一个漏洞:
b
现在在表格中注意,当eq = \a b. a b ____
为a
时,False
与a == b
列相反,因此在这种情况下我们应该反转b
并将其归还。
要反转b
,我们希望b
为False
时为b
,反之亦然。在编码中,即:
True
这就是b False True
a
时我们应该返回的内容,所以我们填写另一个洞:
False
现在我们只展开eq = \a b. a b (b False True)
和False
True
你有它。