การเรียกซ้ำแบบไม่ระบุชื่อ
Combinator จุดคงที่เป็นฟังก์ชั่นการเรียงลำดับที่สูงกว่าfix
ซึ่งตามคำจำกัดความสอดคล้องกับความเท่าเทียม
forall f. fix f = f (fix f)
fix f
แสดงถึงวิธีการแก้x
สมการคงที่
x = f x
แฟกทอเรียลของจำนวนธรรมชาติสามารถพิสูจน์ได้ด้วย
fact 0 = 1
fact n = n * fact (n - 1)
การใช้fix
การพิสูจน์เชิงสร้างสรรค์โดยพลการเหนือฟังก์ชั่นทั่วไป / μ-recursive สามารถรับได้โดยไม่มีการอ้างอิงตนเองแบบไม่สมมาตร
fact n = (fix fact') n
ที่ไหน
fact' rec n = if n == 0
then 1
else n * rec (n - 1)
ดังนั้น
fact 3
= (fix fact') 3
= fact' (fix fact') 3
= if 3 == 0 then 1 else 3 * (fix fact') (3 - 1)
= 3 * (fix fact') 2
= 3 * fact' (fix fact') 2
= 3 * if 2 == 0 then 1 else 2 * (fix fact') (2 - 1)
= 3 * 2 * (fix fact') 1
= 3 * 2 * fact' (fix fact') 1
= 3 * 2 * if 1 == 0 then 1 else 1 * (fix fact') (1 - 1)
= 3 * 2 * 1 * (fix fact') 0
= 3 * 2 * 1 * fact' (fix fact') 0
= 3 * 2 * 1 * if 0 == 0 then 1 else 0 * (fix fact') (0 - 1)
= 3 * 2 * 1 * 1
= 6
หลักฐานทางการฉบับนี้ว่า
fact 3 = 6
ใช้วิธีการเทียบเท่า combinator จุดคงที่สำหรับการเขียนใหม่
fix fact' -> fact' (fix fact')
แลมบ์ดาแคลคูลัส
untyped แลมบ์ดาแคลคูลัสพิธีประกอบด้วยในไวยากรณ์บริบทฟรี
E ::= v Variable
| λ v. E Abstraction
| E E Application
ที่v
ช่วงเหนือตัวแปรพร้อมกับกฎการลดเบต้าและกทพ
(λ x. B) E -> B[x := E] Beta
λ x. E x -> E if x doesn’t occur free in E Eta
ลด Beta ทดแทนเกิดขึ้นฟรีทั้งหมดของตัวแปรx
ในนามธรรม (“ฟังก์ชั่น”) ร่างกายB
โดยการแสดงออก E
(“ข้อโต้แย้ง”) การลด Eta ช่วยลดสิ่งที่ซ้ำซ้อน บางครั้งก็ถูกละไว้จากพิธีการ ลดลงไม่ได้แสดงออกซึ่งกฎการลดไม่มีผลบังคับใช้อยู่ในปกติหรือรูปแบบที่เป็นที่ยอมรับ
λ x y. E
เป็นการจดชวเลข
λ x. λ y. E
(นามธรรมหลายสิ่งที่เป็นนามธรรม)
E F G
เป็นการจดชวเลข
(E F) G
(การเชื่อมโยงด้านซ้ายของแอปพลิเคชัน)
λ x. x
และ
λ y. y
มีอัลฟาเทียบเท่า
สิ่งที่เป็นนามธรรมและการประยุกต์ใช้เป็นเพียง“ ดั้งเดิมภาษา” ของแคลคูลัสแลมบ์ดา แต่พวกเขาอนุญาตให้เข้ารหัสข้อมูลที่ซับซ้อนและการดำเนินงานโดยพลการ
เลขคริสตจักรเป็นการเข้ารหัสของตัวเลขธรรมชาติคล้ายกับธรรมชาติ Peano-axiomatic
0 = λ f x. x No application
1 = λ f x. f x One application
2 = λ f x. f (f x) Twofold
3 = λ f x. f (f (f x)) Threefold
. . .
SUCC = λ n f x. f (n f x) Successor
ADD = λ n m f x. n f (m f x) Addition
MULT = λ n m f x. n (m f) x Multiplication
. . .
หลักฐานอย่างเป็นทางการว่า
1 + 2 = 3
ใช้กฎการเขียนซ้ำของการลดเบต้า:
ADD 1 2
= (λ n m f x. n f (m f x)) (λ g y. g y) (λ h z. h (h z))
= (λ m f x. (λ g y. g y) f (m f x)) (λ h z. h (h z))
= (λ m f x. (λ y. f y) (m f x)) (λ h z. h (h z))
= (λ m f x. f (m f x)) (λ h z. h (h z))
= λ f x. f ((λ h z. h (h z)) f x)
= λ f x. f ((λ z. f (f z)) x)
= λ f x. f (f (f x)) Normal form
= 3
combinators
ในแคลคูลัสแลมบ์ดาผู้รวมภาพเป็นนามธรรมที่ไม่มีตัวแปรอิสระ เรียบง่ายที่สุด: I
combinator ตัวตน
λ x. x
isomorphic กับฟังก์ชันตัวตน
id x = x
Combinator ดังกล่าวเป็นตัวดำเนินการดั้งเดิมของCombinator Calculiเช่นระบบ SKI
S = λ x y z. x z (y z)
K = λ x y. x
I = λ x. x
ลดเบต้าไม่normalizing อย่างยิ่ง ; ไม่ใช่นิพจน์ที่ลดได้ทั้งหมด“ redexes”, รวมตัวกันเป็นรูปแบบปกติภายใต้การลดเบต้า ตัวอย่างง่ายๆคือแอปพลิเคชันที่แตกต่างกันของโอเมก้าω
combinator
λ x. x x
เพื่อตัวเอง:
(λ x. x x) (λ y. y y)
= (λ y. y y) (λ y. y y)
. . .
= _|_ Bottom
การลดนิพจน์ย่อยที่อยู่ทางซ้ายสุด (“ หัว”) จะถูกจัดลำดับความสำคัญ คำสั่งที่บังคับใช้จะทำให้เกิดข้อโต้แย้งก่อนการแทนที่คำสั่งปกติไม่ได้ กลยุทธ์ทั้งสองนั้นคล้ายคลึงกับการประเมินความกระตือรือร้นเช่น C และการประเมินผลที่ขี้เกียจเช่น Haskell
K (I a) (ω ω)
= (λ k l. k) ((λ i. i) a) ((λ x. x x) (λ y. y y))
diverges ภายใต้การลดลงของเบต้าแบบกระตือรือร้นสำหรับการสมัคร
= (λ k l. k) a ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ y. y y) (λ y. y y))
. . .
= _|_
ตั้งแต่ในความหมายที่เข้มงวด
forall f. f _|_ = _|_
แต่มาบรรจบกันภายใต้การลดลงของเบต้าตามลำดับปกติที่ขี้เกียจ
= (λ l. ((λ i. i) a)) ((λ x. x x) (λ y. y y))
= (λ l. a) ((λ x. x x) (λ y. y y))
= a
หากนิพจน์มีรูปแบบปกติการลดค่าเบต้าตามลำดับแบบปกติจะพบได้
Y
คุณสมบัติที่สำคัญของY
combinator จุดคงที่
λ f. (λ x. f (x x)) (λ x. f (x x))
ได้รับจาก
Y g
= (λ f. (λ x. f (x x)) (λ x. f (x x))) g
= (λ x. g (x x)) (λ x. g (x x)) = Y g
= g ((λ x. g (x x)) (λ x. g (x x))) = g (Y g)
= g (g ((λ x. g (x x)) (λ x. g (x x)))) = g (g (Y g))
. . . . . .
ความเท่ากัน
Y g = g (Y g)
isomorphic ถึง
fix f = f (fix f)
แคลคูลัสแลมบ์ดาที่ไม่ได้พิมพ์สามารถเข้ารหัสข้อพิสูจน์เชิงสร้างสรรค์ตามอำเภอใจเหนือฟังก์ชันทั่วไป / μ-recursive
FACT = λ n. Y FACT' n
FACT' = λ rec n. if n == 0 then 1 else n * rec (n - 1)
FACT 3
= (λ n. Y FACT' n) 3
= Y FACT' 3
= FACT' (Y FACT') 3
= if 3 == 0 then 1 else 3 * (Y FACT') (3 - 1)
= 3 * (Y FACT') (3 - 1)
= 3 * FACT' (Y FACT') 2
= 3 * if 2 == 0 then 1 else 2 * (Y FACT') (2 - 1)
= 3 * 2 * (Y FACT') 1
= 3 * 2 * FACT' (Y FACT') 1
= 3 * 2 * if 1 == 0 then 1 else 1 * (Y FACT') (1 - 1)
= 3 * 2 * 1 * (Y FACT') 0
= 3 * 2 * 1 * FACT' (Y FACT') 0
= 3 * 2 * 1 * if 0 == 0 then 1 else 0 * (Y FACT') (0 - 1)
= 3 * 2 * 1 * 1
= 6
(การคูณล่าช้ารวมกัน)
สำหรับแคลคูลัสแลมบ์ดาที่ไม่ได้พิมพ์ออกมาจากโบสถ์ก็มีการแสดงให้เห็นว่ามีจำนวนอนันต์นับไม่ถ้วนที่เรียกว่า combinators คงที่ที่Y
อยู่ข้างใน
X = λ f. (λ x. x x) (λ x. f (x x))
Y' = (λ x y. x y x) (λ y x. y (x y x))
Z = λ f. (λ x. f (λ v. x x v)) (λ x. f (λ v. x x v))
Θ = (λ x y. y (x x y)) (λ x y. y (x x y))
. . .
การลดเบต้าตามลำดับปกติทำให้แลมบ์ดาแลมบ์ดาที่ยังไม่ผ่านการแยกออกมาเป็นระบบการเขียนที่สมบูรณ์แบบของทัวริง
ใน Haskell สามารถติดตั้ง Combinator แบบจุดคงที่ได้อย่างหรูหรา
fix :: forall t. (t -> t) -> t
fix f = f (fix f)
ความเกียจคร้านของ Haskell จะทำให้เป็นเรื่องปกติก่อนที่จะมีการประเมิน subexpressions ทั้งหมด
primes :: Integral t => [t]
primes = sieve [2 ..]
where
sieve = fix (\ rec (p : ns) ->
p : rec [n | n <- ns
, n `rem` p /= 0])