Quy tắc giảm cho IF?


7

Tôi đang làm việc thông qua "Việc thực hiện các ngôn ngữ lập trình chức năng" của Simon Peyton Jones và ở trang 20 tôi thấy:

NẾU TRUE ((.pp.p) 3) NẾU TRUE 3 (mỗi β đỏ) (1)
                   (X.IF TRUE 3 x) (mỗi η đỏ) (2)
                   (Λx.3) (3)

Bước 1 đến 2 được giải thích là chuyển đổi.. Nhưng từ 2 đến 3, nó nói "Bước cuối cùng là quy tắc giảm cho IF." Tôi không chắc quy tắc giảm này là gì.

Câu trả lời:


10

Quy tắc rút gọn mà bạn yêu cầu là quy tắc thông thường cho các câu lệnh IF. Nó bao gồm hai quy tắc tính toán và một quy tắc ngữ cảnh:

  • IF TRUE a b a

  • IF FALSE a b b

  • aaIF a b cIF a b c

Trong cả cài đặt gọi theo giá trị (nghiêm ngặt) và gọi theo nhu cầu (lười biếng), cả hai abcó thể là biểu thức tùy ý. Họ không cần phải là giá trị.

Các quy tắc loại này, làm giảm các chức năng cụ thể (ở đây IF), thường được gọi là quy tắc delta.

Bây giờ, bước lý do (2) ở trên là cần thiết để quy tắc rút gọn cho IF có thể áp dụng. IFyêu cầu 3 đối số, nhưng trong thuật ngữ gốc, nó chỉ có hai, vì vậy không thể giảm. (IFđang được áp dụng một phần, giống như bất kỳ chức năng nào trong Haskell. Điều này có nghĩa là chỉ một phần đối số của nó cần được cung cấp.) Việc sử dụngη-Phát triển cung cấp đối số bổ sung, mà không thay đổi ngữ nghĩa.


1
Tôi sẽ thêm IF a b c -> IF a' b c with a-> a'
Fabio F.

Có nhưng chuyển đổi không nên thêm điều kiện? Có vẻ như việc chuyển từ IF TRUE 3 sang λx.IF TRUE 3 x (xin lỗi tôi bỏ qua x trên bài đăng gốc) - nếu sau đó được sử dụng trong bước tiếp theo là tuân thủ giảm IF - không chính xác, vì chúng tôi đã thêm các x chỉ để được nửa ELSE bán. Ví dụ: nếu vấn đề là NẾU SAU 3 thì sao? Chúng ta có thể chuyển đổi ed thành edx.IF FALSE 3 x không? Sau đó, bước 3 sẽ là λx.x , có vẻ không đúng ... Lạ, cái này. Vấn đề là chứng minh IF TRUE ((p.p) 3) tương đương với (λx.3) Điều này làm tôi bối rối.
thiên hà

@galaxbeing: Tôi đã thêm một bình luận về lý do tại sao bạn sử dụng η-sự bành trướng. Cuối cùng, đó là để IF có hai đối số, và do đó các quy tắc rút gọn của nó có thể được áp dụng.
Dave Clarke

@galaxybeing IF FALSE 3 tương đương với \x -> IF FALSE 3 x(giả sử ứng dụng một phần IFđược cho phép). IF FALSE 3cần thêm một đối số để giảm xuống một giá trị; áp dụng nó cho xnăng suất IF FALSE 3 x, mà giảm đến đơn giản x. Vì vậy, IF FALSE 3thực sự tương đương với \x -> x, miễn là chúng ta đang sử dụng phép tính lambda chưa được xử lý; nếu bạn thử điều này trong Haskell (bằng cách xác định hàm if' :: Bool -> a -> ađể bạn có thể áp dụng một phần) thì bạn sẽ có được idchức năng chuyên biệt cho bất kỳ loại Haskell nào cho 3.
Ben
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.