Rõ ràng, dẫn xuất trực quan của tổ hợp điểm cố định (tổ hợp Y)?


28

Bộ kết hợp điểm cố định FIX (còn gọi là bộ kết hợp Y) trong phép tính lambda (chưa được đánh dấu) ( ) được định nghĩa là:λ

CỐ ĐỊNHλf.(λx.f (λy.x x y)) (λx.f (λy.x x y))

Tôi hiểu mục đích của nó và tôi có thể theo dõi việc thực hiện ứng dụng của nó hoàn toàn tốt; Tôi muốn hiểu làm thế nào để lấy FIX từ các nguyên tắc đầu tiên .

Đây là những gì tôi có được khi cố gắng tự mình lấy nó:

  1. CỐ ĐỊNH là một hàm: FIX λ
  2. FIX lấy một hàm khác, f , để làm cho nó đệ quy: FIX λf.
  3. Đối số đầu tiên của hàm f là "tên" của hàm, được sử dụng trong trường hợp ứng dụng đệ quy được dự định. Do đó, tất cả các lần xuất hiện của đối số đầu tiên thành f nên được thay thế bằng một hàm và hàm này sẽ trông đợi các đối số còn lại của f (giả sử f lấy một đối số): FIX λf.f (λy.y)

Đây là nơi tôi không biết cách "bước một bước" trong lý luận của mình. Các hình elip nhỏ cho biết vị trí FIX của tôi bị thiếu thứ gì đó (mặc dù tôi chỉ có thể biết điều đó bằng cách so sánh nó với FIX "thực").

Tôi đã đọc các loại và ngôn ngữ lập trình , vốn không cố gắng lấy nó trực tiếp, và thay vào đó giới thiệu người đọc đến The Little Schemer cho một dẫn xuất. Tôi cũng đã đọc điều đó và "đạo hàm" của nó không hữu ích lắm. Ngoài ra, nó không phải là một dẫn xuất trực tiếp và sử dụng một ví dụ rất cụ thể và một nỗ lực đặc biệt để viết một hàm đệ quy phù hợp trong λ .


1
Bài đăng này có thể hữu ích. Nói chung, tôi nghĩ chỉ cần trải qua và tính toán một số lần lặp của bộ kết hợp là hữu ích trong việc tìm ra lý do tại sao nó hoạt động.
Xodarap

2
Có một số tổ hợp điểm cố định khác nhau. Có lẽ mọi người chỉ chơi với tổ hợp cho đến khi họ tình cờ thấy họ.
Yuval Filmus

@YuvalFilmus, đó là những gì nghiên cứu của tôi và câu trả lời cho câu hỏi này đang bắt đầu khiến tôi phải suy nghĩ. Nhưng tôi vẫn nghĩ rằng sẽ được hướng dẫn để "xem" cách thức (các) tổ hợp được hình thành một cách hợp lý, một kỹ năng sẽ đặc biệt hữu ích khi, ví dụ, cố gắng xây dựng một tổ hợp mới.
BlueBomber

Đọc chương 9 trong "The Little Lisper", của Daniel P. Friedman (hoặc "The Little Schemer").
dùng18199

2
OP dường như chỉ ra rằng họ đã đọc điều đó.
Raphael

Câu trả lời:


29

Tôi chưa đọc nó ở bất cứ đâu, nhưng đây là cách tôi tin rằng có thể đã được bắt nguồn:Y

Chúng ta có một hàm đệ quy , có thể là giai thừa hoặc bất cứ thứ gì khác tương tự. Một cách không chính thức, chúng tôi định nghĩa là thuật ngữ giả-lambda trong đó xảy ra theo định nghĩa riêng của nó:fff

f=ff

Đầu tiên, chúng tôi nhận ra rằng cuộc gọi đệ quy có thể được xem là một tham số:

f=(λr.(rr))Mf

Bây giờ chúng ta có thể định nghĩa nếu chúng ta chỉ có cách vượt qua nó như là một đối số cho chính nó. Điều này là không thể, tất nhiên, bởi vì chúng tôi không có trong tay. Những gì chúng ta có trong tay là . Vì chứa mọi thứ chúng ta cần để xác định , nên chúng ta có thể cố gắng chuyển làm đối số thay vì và cố gắng xây dựng lại từ nó sau này bên trong. Nỗ lực đầu tiên của chúng tôi trông như thế này:ffMMfMff

f=(λr.(rr))M(λr.(rr))M

Tuy nhiên, điều này không hoàn toàn chính xác. Trước đây, đã thay thế cho bên . Nhưng bây giờ chúng tôi vượt qua thay thế. Chúng ta phải bằng cách nào đó sửa chữa tất cả những nơi mà chúng tôi sử dụng để họ tái tạo lại từ . Trên thực tế, điều này không khó chút nào: Bây giờ chúng ta biết rằng , ở mọi nơi chúng ta sử dụng chúng ta chỉ cần thay thế nó bằng .frMMrfMf=MMr(rr)

f=(λr.((rr)(rr)))M(λr.((rr)(rr)))M

Giải pháp này là tốt, nhưng chúng tôi đã phải thay đổi bên trong. Điều này không thuận tiện lắm. Chúng ta có thể làm điều này một cách tao nhã hơn mà không phải sửa đổi bằng cách giới thiệu một khác gửi cho đối số của nó được áp dụng cho chính nó: Bằng cách biểu thị là chúng ta nhận đượcMMλMMλx.M(xx)

f=(λx.(λr.(rr))M(xx))(λx.(λr.(rr))M(xx))

Theo cách này, khi được thay thế cho , được thay thế cho , theo định nghĩa bằng . Điều này cho chúng ta một định nghĩa không đệ quy của , được biểu thị như một thuật ngữ lambda hợp lệ!MxMMrff

Việc chuyển đổi sang bây giờ dễ dàng. Chúng ta có thể sử dụng một thuật ngữ lambda tùy ý thay vì và thực hiện thủ tục này trên đó. Vì vậy, chúng ta có thể yếu tố ra và xác địnhYMM

Y=λm.(λx.m(xx))(λx.m(xx))

Thật vậy, giảm xuống như chúng ta đã định nghĩa nó.YMf


Lưu ý: Tôi đã dẫn xuất vì nó được định nghĩa trong văn học. Các combinator bạn đã mô tả là một biến thể của cho cuộc gọi-by-giá trị ngôn ngữ, đôi khi còn được gọi là . Xem bài viết Wikipedia này .YYZ


1
Các thiếu-nhưng-dường như hiển nhiên trực giác rằng câu trả lời tuyệt vời của bạn đã cho tôi là một hàm đệ quy cần chính nó như là một cuộc tranh cãi, vì vậy chúng tôi bắt đầu với một giả định rằng chức năng sẽ có dạng đối với một số . Sau đó, khi chúng tôi xây dựng , chúng tôi sử dụng xác nhận đó rằng được định nghĩa là ứng dụng của một cái gì đó vào bên trong , ví dụ, áp dụng cho trong câu trả lời của bạn, theo định nghĩa bằng . Hấp dẫn! f=X(X)XXfXxxf
BlueBomber

11

Như Yuval đã chỉ ra rằng không chỉ có một toán tử điểm cố định. Có rất nhiều trong số họ. Nói cách khác, phương trình của định lý điểm cố định không có một câu trả lời duy nhất. Vì vậy, bạn không thể lấy được toán tử từ họ.

Nó giống như hỏi làm thế nào mọi người lấy được làm giải pháp cho . Họ không! Phương trình không có một giải pháp duy nhất.(x,y)=(0,0)x=y


Chỉ trong trường hợp điều bạn muốn biết là định lý điểm cố định đầu tiên được phát hiện như thế nào. Hãy để tôi nói rằng tôi cũng tự hỏi về cách họ đưa ra các định lý điểm cố định / đệ quy khi tôi lần đầu tiên nhìn thấy chúng. Có vẻ rất tài tình. Đặc biệt ở dạng lý thuyết tính toán. Không giống như những gì Yuval nói, đó không phải là trường hợp mà mọi người chơi xung quanh cho đến khi họ tìm thấy thứ gì đó. Đây là những gì tôi đã tìm thấy:

Theo tôi nhớ, định lý ban đầu là do SC Kleene. Kleene đã đưa ra định lý điểm cố định ban đầu bằng cách cứu vãn bằng chứng về sự không nhất quán của phép tính lambda ban đầu của Church. Tính toán lambda ban đầu của nhà thờ phải chịu một nghịch lý kiểu người Nga. Các tính toán lambda sửa đổi tránh vấn đề. Kleene đã nghiên cứu bằng chứng về sự không nhất quán có thể để xem làm thế nào nếu phép tính lambda bị biến đổi sẽ gặp phải một vấn đề tương tự và biến bằng chứng về sự không nhất quán thành một định lý hữu ích trong phép tính lambda đã sửa đổi. Thông qua công việc của mình về sự tương đương của phép tính lambada với các mô hình tính toán khác (máy Turing, hàm đệ quy, v.v.), ông đã chuyển nó sang các mô hình tính toán khác.


Làm thế nào để lấy được toán tử mà bạn có thể yêu cầu? Đây là cách tôi giữ nó trong tâm trí. Định lý điểm cố định là về việc loại bỏ tự tham chiếu.

Mọi người đều biết nghịch lý nói dối:

Tôi là một hang ổ.

Hoặc ở dạng ngôn ngữ hơn:

Câu này là sai.

Bây giờ hầu hết mọi người nghĩ rằng vấn đề với câu này là với sự tự tham khảo. Không phải vậy! Việc tự tham khảo có thể được loại bỏ (vấn đề là với sự thật, một ngôn ngữ không thể nói về sự thật của các câu nói chung, xem tính không thể xác định của Tarski về định lý chân lý ). Hình thức mà tự tham chiếu được loại bỏ như sau:

Nếu bạn viết đoạn trích sau hai lần, lần thứ hai bên trong dấu ngoặc kép, câu kết quả là sai: "Nếu bạn viết đoạn trích sau hai lần, lần thứ hai bên trong dấu ngoặc kép, câu kết quả là sai:"

Không tự tham khảo, chúng tôi có hướng dẫn về cách xây dựng một câu và sau đó làm một cái gì đó với nó. Và câu được xây dựng bằng với hướng dẫn. Lưu ý rằng trong -calculus, chúng tôi không cần dấu ngoặc kép vì không có sự phân biệt giữa dữ liệu và hướng dẫn.λ

Bây giờ nếu chúng ta phân tích điều này, chúng ta có trong đó là hướng dẫn để xây dựng và làm một cái gì đó cho nó.MMMxxx

Mx=f(xx)

Vậy là và chúng ta cóMλx.f(xx)

MM=(λx.f(xx))(λx.f(xx))

Điều này là cho một cố định . Nếu bạn muốn biến nó thành toán tử, chúng ta chỉ cần thêm và chúng ta nhận :fλfY

Y=λf.(MM)=λf.((λx.f(xx))(λx.f(xx)))

Vì vậy, tôi chỉ ghi nhớ nghịch lý mà không tự tham khảo và điều đó giúp tôi hiểu là gì.Y


3

Vì vậy, bạn cần xác định một tổ hợp điểm cố định

fix f = f (fix f)
      = f (f (fix f))
      = f (f (f ... ))

nhưng không có đệ quy rõ ràng. Hãy bắt đầu với công cụ kết hợp đơn giản nhất

omega = (\x. x x) (\x. x x)
      = (\x. x x) (\x. x x)
      = ...

Các xlambda đầu tiên được thay thế nhiều lần bởi lambda thứ hai. Chuyển đổi alpha đơn giản làm cho quá trình này rõ ràng hơn:

omega =  (\x. x x) (\x. x x)
      =α (\x. x x) (\y. y y)
      =β (\y. y y) (\y. y y)
      =α (\y. y y) (\z. z z)
      =β (\z. z z) (\z. z z)

Tức là biến trong lambda đầu tiên luôn biến mất. Vì vậy, nếu chúng ta thêm một flambda đầu tiên

(\x. f (x x)) (\y. y y)

ý fchí sẽ tăng lên

f ((\y. y y) (\y. y y))

Chúng tôi đã omegatrở lại. Bây giờ nên rõ ràng rằng, nếu chúng ta thêm một flambda thứ hai, thì nó fsẽ xuất hiện trong lambda đầu tiên và sau đó nó sẽ nổi lên:

Y f = (\x. x x)     (\x. f (x x))
      (\x. f (x x)) (\x. f (x x)) -- the classical definition of Y

Kể từ khi

(\x. s t) z = s ((\x. t) z), if `x' doesn't occur free in `s'

chúng ta có thể viết lại biểu thức như

f ((\x. x x) (\x. f (x x))

đó chỉ là

f (Y f)

và chúng ta đã có phương trình của chúng tôi Y f = f (Y f). Vì vậy, Ytổ hợp cơ bản là

  1. nhân đôi f
  2. làm cho đầu tiên flên
  3. nói lại

2

Bạn có thể đã thấy ví dụ kinh điển về phương trình mà không có dạng bình thường:

(λx.xx)(λx.xx)(λx.xx)(λx.xx)

Một phương trình tương tự được đề xuất bởi điều đó cho đệ quy chung:

(A)(λx.R(xx))(λx.R(xx)) R( (λx.R(xx))(λx.R(xx)) )R(R( (λx.R(xx))(λx.R(xx)) ))

(A) là một cách để viết các phương trình đệ quy chung trong phép tính lambda (ngoài đệ quy nguyên thủy). Vậy làm thế nào để bạn giải phương trình ? Cắm vào cho trong phương trình trên để có được:Yf=f(Yf)fR

Yf=(λx.f(xx))(λx.f(xx))
Y=λf.(λx.f(xx))(λx.f(xx))
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.