Máy phát điện tính toán Lambda


10

Tôi không biết nơi nào khác để hỏi câu hỏi này, tôi hy vọng đây là một nơi tốt.

Tôi chỉ tò mò muốn biết liệu có thể tạo ra máy tính lambda không; về cơ bản, một vòng lặp sẽ, trong thời gian vô hạn, tạo ra mọi hàm tính toán lambda có thể. (giống như ở dạng chuỗi).

Vì phép tính lambda rất đơn giản, chỉ có một vài yếu tố theo ký hiệu của nó, tôi nghĩ rằng có thể (mặc dù, không hữu ích lắm) để tạo ra tất cả các kết hợp có thể có của các yếu tố ký hiệu đó, bắt đầu bằng các kết hợp đơn giản nhất, và do đó tạo ra mọi lambda có thể hàm tính toán.

Tất nhiên, tôi gần như không biết gì về tính toán lambda vì vậy tôi không biết liệu điều này có thực sự khả thi hay không.

Là nó? Nếu vậy, nó khá đơn giản như tôi đã hình dung ra, hoặc về mặt kỹ thuật là có thể, nhưng khó đến mức nó thực sự không thể?

Tái bút Tôi không nói về các hàm giảm beta, tôi chỉ nói về mọi ký hiệu hợp lệ của mọi hàm tính toán lambda.

Câu trả lời:


19

Chắc chắn, đây là một bài tập mã hóa tiêu chuẩn.

Trước hết, hãy để bất kỳ hàm tính toán tính toán nào, được gọi là hàm ghép nối. Một lựa chọn tiêu chuẩn làp:N2N

p(n,m)=(n+m)(n+m+1)2+n

Người ta có thể chứng minh rằng đây là một mệnh đề, do đó, với bất kỳ tự nhiên nào , chúng ta có thể tính n , m sao cho p ( n , m ) = k .kn,mp(n,m)=k

Với các điều khoản lambda enumerate, sửa chữa bất kỳ liệt kê các tên biến: .x0,x1,x2,

Sau đó, với mỗi số tự nhiên , in l a m b d a ( i ) , được định nghĩa đệ quy như sau:ilambda(i)

  • nếu chẵn, hãy để j = i / 2 và trả về biến x jij=i/2xj
  • nếu là số lẻ, hãy để j = ( i - 1 ) / 2ij=(i1)/2
    • nếu là chẵn, hãy để k = j / 2 và tìm n , m sao cho p ( n , m ) = k ; tính N = l a m b d a ( n ) , M = l a m b d a ( m ) ; ứng dụng trả lại ( N M )jk=j/2n,mp(n,m)=kN=lambda(n),M=lambda(m)(NM)
    • nếu là số lẻ, hãy để k = ( j - 1 ) / 2 và tìm n , m sao cho p ( n , m ) = k ; tính M = l a m b d a ( m ) ; trở trừu tượng ( λ x n . M )jk=(j1)/2n,mp(n,m)=kM=lambda(m)(λxn. M)

Chương trình này được chứng minh bởi các song ánh sau "đại số" liên quan đến các thiết lập của tất cả các điều khoản lambda :Λ

ΛN+(Λ2+N×Λ)

được đọc là "các thuật ngữ lambda, về mặt cú pháp, là sự kết hợp rời rạc của 1) biến (được biểu diễn dưới dạng tự nhiên), 2) ứng dụng (được tạo bởi hai thuật ngữ lambda) và 3) trừu tượng (một biến cặp / tự nhiên + thuật ngữ lambda ) ".

N2NpN+NN

Quy trình này là chung và sẽ hoạt động trên hầu hết mọi ngôn ngữ được tạo thông qua ngữ pháp không ngữ cảnh, sẽ cung cấp một sự đồng hình tương tự như ngôn ngữ trên.


Ồ, cảm ơn, có thể bạn đại diện cho đây là mã giả? Tôi chắc chắn hiểu điều đó tốt hơn vì tôi không có bằng cấp cs.
Ngăn xếp hợp pháp

3
lambda(n)if n%2==0 ...n,mp(n,m)=kn,mn,mk

1
a=12(8k+11),b=12a(a+1),n=bk,m=an

12

Đúng. Lấy một cái gì đó liệt kê tất cả các chuỗi ASCII có thể. Đối với mỗi đầu ra, kiểm tra xem đó có phải là cú pháp tính toán lambda hợp lệ xác định hàm không; nếu không, bỏ qua nó (Kiểm tra đó có thể được thực hiện.) Điều đó liệt kê tất cả các hàm tính toán lambda.


4
Về cơ bản, tất cả các vấn đề như thế này đều được giải quyết bằng cách gọi khỉ gõ ...
xuq01

5
Hoặc bạn có thể liệt kê trực tiếp các thuật ngữ tính toán lambda. Nhanh hơn rất nhiều so với các chuỗi ngẫu nhiên vì mọi đầu ra là một thuật ngữ được định dạng đúng. Điều đó sẽ giống như việc thay thế những con khỉ gõ bằng máy phát Shakespeare.
Dan D.

11

Như đã đề cập, đây chỉ là liệt kê các thuật ngữ từ một ngôn ngữ tự do ngữ cảnh, vì vậy chắc chắn có thể thực hiện được. Nhưng có nhiều toán học thú vị hơn đằng sau nó, đi sâu vào lĩnh vực tổ hợp anlytical.

Bài viết Đếm và tạo các thuật ngữ trong phép tính lambda nhị phân chứa một cách xử lý vấn đề liệt kê, và nhiều hơn nữa. Để làm cho mọi thứ đơn giản hơn, họ sử dụng một cái gì đó gọi là lambda calulus nhị phân , đây chỉ là một mã hóa các thuật ngữ lambda sử dụng các chỉ số De Bruijn , vì vậy bạn không phải đặt tên biến.

Bài báo đó cũng chứa mã Haskell cụ thể thực hiện thuật toán tạo của chúng. Nó chắc chắn có hiệu quả có thể.

Tôi tình cờ đã viết một triển khai phương pháp của họ ở Julia.


5

Chắc chắn rồi. Chúng ta có thể trực tiếp tạo ra chúng theo định nghĩa của các điều khoản lambda.

Trong Haskell, chúng tôi xác định loại đầu tiên,

data LC a = Var a | App (LC a) (LC a) | Lam a (LC a)

instance Show a => Show (LC a) where
    show (Var i)   = [c | c <- show i, c /= '\'']
    show (App m n) = "(" ++ show m ++ " " ++ show n ++ ")"
    show (Lam v b) = "(^" ++ show (Var v) ++ "." ++ show b ++ ")"

và sau đó với

lambda :: [a] -> [LC a]
lambda vars = terms 
  where
  terms = fjoin [ map Var vars ,
                  fjoin [[App t s | t <- terms] | s <- terms] ,
                  fjoin [[Lam v s | v <- vars ] | s <- terms] ]

  fjoin :: [[a]] -> [a]
  fjoin xs = go (take 1 xs) (drop 1 xs)      -- fair join
      where 
      go [] [] = []
      go a  b  = reverse (concatMap (take 1) a) ++ go 
                     (take 1 b ++ [t | (_:t) <- a]) (drop 1 b)

chúng tôi chỉ liệt kê chúng, ví dụ như

> take 20 $ lambda "xyz"
[x,y,(x x),z,(y x),(^x.x),(x y),(^y.x),((x x) x),(^x.y),(y y),(^z.x),(x (x x)),
 (^y.y),(z x),(^x.(x x)),((x x) y),(^z.y),(y (x x)),(^y.(x x))]

> take 5 $ drop 960 $ lambda "xyz"
[(((x x) y) (z x)),(^y.(^x.((x x) (x x)))),((^x.(x x)) (^x.(x x))),(^x.((^z.x) y
)),((z x) ((x x) y))]

Ω=(λx.xx)(λx.xx)

fjointương đương với Omega đơn nguyên 's diagonal.


0

Tôi đã bắt gặp một công cụ trực tuyến có thể tạo các chuỗi mẫu từ một biểu thức thông thường: https : //www.brows Muff.com/tools/text-from-regex . Bạn có thể tạo rất nhiều thuật ngữ lambda mẫu bằng cách nhập một cái gì đó như thế này:

(\( (lambda \w\. )* \w+ \))* 

Tất nhiên để có được các thuật ngữ với các mức lồng nhau tùy ý, bạn sẽ cần sử dụng một ngữ pháp không ngữ cảnh, đây là một công cụ mô tả để xác định ngôn ngữ hơn một biểu thức thông thường. Tôi chưa bắt gặp một công cụ hiện có để tạo các câu ngôn ngữ mẫu dựa trên định nghĩa ngữ pháp không ngữ cảnh, nhưng không có lý do nào người ta không thể xây dựng.


2
λ
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.