質疑布爾在演算
回答
要理解如何在lambda演算中表示布爾值,可以考慮IF表達式,「if a then b else c」。這是一個表達式,選擇第一個分支,b,如果它是真的,第二個,c,如果它是假的。 Lambda表達式可以做到這一點很容易:
lambda(x).lambda(y).x
會給你第一個它的參數,並
lambda(x).lambda(y).y
給你第二次。因此,如果是那些表現之一,那麼
a b c
給出任何b
或c
,這正是我們想要的如果要做。所以定義
true = lambda(x).lambda(y).x
false = lambda(x).lambda(y).y
和a b c
會像if a then b else c
。
在(n a b)
的內部查看錶達式,表示if n then a else b
。 然後m (n a b) b
裝置
if m then (if n then a else b) else b
該表達式評估爲a
如果兩個m
和n
是true
,以及b
否則。由於a
是函數的第一個參數,b
是第二個參數,true
已被定義爲一個函數,它給出了兩個參數中的第一個參數,因此如果m
和n
都是true
,那麼整個表達式也是如此。否則它是false
。這就是and
的定義!
所有這些都是由Alonzo Church發明的,他發明了lambda演算。
實際上它不僅僅是AND運算符。這是if m and n then a else b
的lambda微積分版本。下面是解釋:
在lambda微積分中,true表示爲一個帶兩個參數*並返回第一個參數的函數。 False表示爲帶有兩個參數*並返回第二個參數的函數。
上面顯示的函數需要四個參數*。從它看起來,m和n應該是布爾值,a和b是其他值。如果m爲真,則它將評估爲其第一個參數,即n a b
。如果n爲真,則這反過來將評估爲a,如果n爲假,則b爲b。如果m爲假,它將評估爲第二個參數b。
所以基本上,如果m和n都爲真,則函數返回a,否則返回b。 (*)其中「取兩個參數」的意思是「採用一個參數並返回一個採用另一個參數的函數」。
編輯迴應您的評論:
and true false
所看到的wiki頁面是這樣的:
的第一步是簡單地用其定義來替代每個標識符,即(λm.λn. m n m) (λa.λb. a) (λa.λb. b)
。現在應用功能(λm.λn. m n m)
。這意味着m n m
中每個出現的m被替換爲第一個參數((λa.λb. a)
),並且每個出現的n被替換爲第二個參數((λa.λb. b)
)。所以我們得到(λa.λb. a) (λa.λb. b) (λa.λb. a)
。現在我們只需應用功能(λa.λb. a)
。由於該函數的主體是簡單的a,即第一個參數,因此它評估爲(λa.λb. b)
,即false
(因爲λx.λy. y
意味着false
)。
謝謝你sepp !!! – 2010-03-08 00:50:57
@sepp:如果你能把下面給我的第二條評論發給Peter,你能幫我一下嗎? – 2010-03-08 01:06:36
在lambda演算中,一個布爾函數表示一個函數,該函數接受兩個參數,一個用於成功,一個用於失敗。這些參數被稱爲延續,因爲它們繼續進行其餘的計算;布爾值True調用成功延續,布爾型False調用失敗延續。這種編碼稱爲教會編碼,其思想是布爾非常像「if-then-else」函數。
所以我們可以說
true = \s.\f.s
false = \s.\f.f
其中s
代表成功,f
代表失敗,反斜槓是一個ASCII拉姆達。
現在,我希望你能看到這是怎麼回事。我們如何編碼and
?那麼,在C,我們可以把它擴大到
n && m = n ? m : false
只有這些功能,所以
(n && m) s f = (n ? m : false) s f = n ? (m s f) : (false s f) = n ? (m s f) : f
,但三元結構,在演算編碼時,僅僅是功能應用,所以我們有
(n && m) s f = (n m false) s f = n (m s f) (false s f) = n (m s f) f
所以最後我們得出
&& = \n . \m . \s . \f . n (m s f) f
如果我們重命名成功和失敗延續到a
和b
我們返回到原來的
&& = \n . \m . \a . \b . n (m a b) b
與在演算其他計算,尤其是在使用邱奇數時,它往往容易解決事情用代數律和等式推理,最後轉換爲lambda表達式。
- 1. 質疑LAMBDA演算
- 2. 哈斯克爾MaybeInt質疑elemIndex
- 3. 質疑
- 4. 質疑
- 5. 演員布爾在SQLite的
- 6. ValidationMessageFor布爾性質
- 7. 質疑在Java中
- 8. select_tag軌質疑
- 9. 質疑MS ACCESS
- 10. 艙單質疑
- 11. 質疑OrientDB圖
- 12. 動作質疑
- 13. C++ - QSettings質疑
- 14. 質疑LocalDateTime
- 15. 質疑的ReferenceProperty
- 16. 質疑PID的
- 17. 泛型質疑
- 18. 泛型質疑
- 19. HTML標籤質疑
- 20. HTML鏈接質疑
- 21. jQuery選擇質疑
- 22. DOM操作質疑
- 23. AJAX HTML PHP質疑
- 24. .NET行動質疑
- 25. 質疑觸發器
- 26. C指針質疑
- 27. pspell回報質疑
- 28. DateTime.ParseExact格式質疑
- 29. TCP Java的質疑
- 30. C#參數質疑
非常感謝你!我發現Lambda微積分真的很難理解,這樣的解釋讓我的生活變得更加輕鬆!再次感謝你。 – 2010-03-08 00:50:33
@Peter:只需要另一個幫助,如果可以的話:我正在閱讀維基百科上的Church Booleans:http://en.wikipedia.org/wiki/Church_encoding#Church_booleans 我無法理解這些示例是如何推斷的並且是對的。 你能幫我理解他們嗎? – 2010-03-08 00:54:29
理解這些長表達式的方法只是記住規則並逐個評估它們,從左到右。所以在表達式'(λm.λn.mnm)(λa.λb.a)(λa.λb.b)' 括號中的第一部分是一個函數,第二部分和第三部分代替m和n: (λa.λb.a)(λa.λb.b)(λa.λb.a)'。然後再次做同樣的事情,記住每個括號中的a和b是完全獨立的。第一部分'(λa.λb.a)'返回兩個參數中的第一個。所以它返回'(λa.λb.b)',這是教會的虛假表示。 – 2010-03-08 09:59:25