ฉันคิดว่าsort
ดังที่แสดงไว้ไม่สามารถพิมพ์ได้บน EAL ฉันไม่สามารถพิสูจน์ได้ แต่มันไม่สามารถใช้ได้กับอัลกอริธึมบทคัดย่อของ Lamping โดยไม่ต้องใช้คำพยากรณ์ ยิ่งกว่านั้นในขณะที่คำศัพท์ค่อนข้างฉลาดและสั้น แต่ก็ใช้กลยุทธ์ที่แปลกประหลาดมากซึ่งไม่เป็นมิตรกับ EAL
แต่เบื้องหลังคำถามนี้มีสิ่งที่น่าสนใจมากกว่านี้: "สามารถใช้ฟังก์ชันการเรียงลำดับ nat ใน EAL ได้หรือไม่" นั่นเป็นคำถามที่ยากมากในตอนนั้น แต่ตอนนี้มันดูน่าสนใจเล็กน้อย ใช่แน่นอน มีหลายวิธีที่ง่ายกว่าในการทำ ตัวอย่างเช่นเราสามารถเติมสก็อตที่เข้ารหัสNatSet
ด้วยคริสตจักรที่เข้ารหัสNat
แล้วแปลงเป็นรายการ นี่คือการสาธิตที่สมบูรณ์:
-- sort_example.mel
-- Sorting a list of Church-encoded numbers on the untyped lambda calculus
-- with terms that can be executed by Lamping's Abstract Algorithm without
-- using the Oracle. Test by calling `mel sort_example.mel`, using Caramel,
-- from https://github.com/maiavictor/caramel
-- Constructors for Church-encoded Lists
-- Haskell: `data List = Cons a (List a) | Nil`
Cons head tail = (cons nil -> (cons head (tail cons nil)))
Nil = (cons nil -> nil)
-- Constructors for Church-encoded Nats
-- Haskell: `data Nat = Succ Nat | Zero`
Succ pred = (succ zero -> (succ (pred succ zero)))
Zero = (succ zero -> zero)
---- Constructors for Scott-encoded NatMaps
---- Those work like lists, where `Yep` constructors mean
---- there is a number on that index, `Nah` constructors
---- mean there isn't, and `End` ends the list.
---- Haskell: `data NatMap = Yep NatMap | Nah NatMap | End`
Yep natMap = (yep nah end -> (yep natMap))
Nah natMap = (yep nah end -> (nah natMap))
End = (yep nah end -> end)
---- insert :: Nat (Church) -> NatMap (Scott) -> NatMap (Scott)
---- Inserts a Church-encoded Nat into a Scott-encoded NatMap.
insert nat natMap = (nat succ zero natMap)
succ pred natMap = (natMap yep? nah? end?)
yep? natMap = (Yep (pred natMap))
nah? natMap = (Nah (pred natMap))
end? = (Nah (pred natMap))
zero natMap = (natMap Yep Yep (Yep End))
---- toList :: NatMap (Scott) -> List Nat (Church)
---- Converts a Scott-Encoded NatMap to a Church-encoded List
toList natMap = (go go natMap 0)
go go natMap nat = (natMap yep? nah? end?)
yep? natMap = (Cons nat (go go natMap (Succ nat)))
nah? natMap = (go go natMap (Succ nat))
end? = Nil
---- sort :: List Nat (Church) -> List Nat (Church)
---- Sorts a Church-encoded list of Nats in ascending order.
sort nats = (toList (nats insert End))
-- Test
main = (sort [1,4,5,2,3])
นี่คือรูปแบบปกติ bruijn ที่จัดทำดัชนีของรุ่นที่เปลี่ยนแปลงเล็กน้อยsort
ข้างต้นซึ่งจะต้องได้รับ(x -> (x x))
เป็นอาร์กิวเมนต์แรกเพื่อให้ทำงานได้ (ไม่เช่นนั้นจะไม่มีรูปแบบปกติ):
λλ(((1 λλλ(((1 λλλ((1 3) (((((5 5) 2) λλ(1 ((5 1) 0))) 1) 0)))
λ(((3 3) 0) λλ(1 ((3 1) 0)))) λλ0)) ((0 λλ(((1 λλ(((0 λλλλ(2 (
5 3))) λλλλ(1 (5 3))) λλλ(1 (4 3)))) λ(((0 λλλλ(2 3)) λλλλ(2 3
)) λλλ(2 λλλ0))) 0)) λλλ0)) λλ0)
ง่าย ๆ ในการหวนกลับ