-calculus với sự phản chiếu


23

Tôi đang tìm kiếm một phép tính đơn giản hỗ trợ lý luận về sự phản chiếu , cụ thể là sự hướng nội và thao tác của các chương trình đang chạy.

Có phần mở rộng -calculus nào cho phép người ta chuyển đổi -terms thành một hình thức có thể được thao tác bằng cú pháp và sau đó được đánh giá không?λλλ

Tôi tưởng tượng rằng phép tính có hai thuật ngữ bổ sung chính:

  • reflect v : lấy và tạo ra một đại diện của sửa đổi để thao tác cú pháp.vvv
  • eval v : lấy một đại diện cú pháp của một thuật ngữ và đánh giá nó.

Để hỗ trợ sự phản ánh, cần phải có một đại diện cú pháp. Nó sẽ trông giống như:

  • λx.e sẽ được biểu diễn dưới dạng một thuật ngữ , trong đó là phiên bản phản ánh của ,R ( e ) e(LAM R(e))R(e)e
  • e e sẽ được biểu diễn dưới dạng thuật ngữ và(APP R(e) R(e))
  • x sẽ được biểu diễn dưới dạng .(VAR x)

Với biểu diễn này, khớp mẫu có thể được sử dụng để thao tác các thuật ngữ.

Nhưng chúng tôi gặp phải một vấn đề. và cần được mã hóa dưới dạng các thuật ngữ, cũng như khớp mẫu. Đối phó với điều này có vẻ đơn giản, thêm , và , nhưng tôi có cần thêm các thuật ngữ khác để hỗ trợ thao tác này không?e v a l R E F L E C T E V A L M A T C HreflectevalREFLECTEVALMATCH

Có những lựa chọn thiết kế cần phải được thực hiện. Nên những gì chức năng ám chỉ ở trên làm với cơ thể của và ? có nên biến đổi cơ thể hay không?r e f l e c t e v a l R ( - )R()reflectevalR()

Vì tôi không quá quan tâm đến việc nghiên cứu sự phản chiếu của chính nó - phép tính sẽ đóng vai trò là phương tiện cho nghiên cứu khác - tôi không muốn phát minh lại bánh xe.

Có bất kỳ tính toán hiện có phù hợp với những gì tôi vừa mô tả?

Theo như tôi có thể nói, các tính toán như MetaML, được đề xuất trong một nhận xét, đi một chặng đường dài, nhưng chúng không bao gồm khả năng tạo mẫu khớp và giải mã các đoạn mã đã được xây dựng.

Một điều tôi muốn có thể làm là như sau:

  • let x=λy.y in reflect x(LAM (VAR y) (VAR y))

Và sau đó thực hiện khớp mẫu trên kết quả để xây dựng một biểu thức hoàn toàn khác.

Đây chắc chắn không phải là một phần mở rộng bảo thủ cho -calculus và siêu lý thuyết có thể là xấu, nhưng đây là loại điểm cho ứng dụng của tôi. Tôi muốn phá vỡ giao dịch tách rời.λλλ


MetaML là một ngôn ngữ phản chiếu được gõ với toán tử của ngoặc đơn thực hiện REFLECT của bạn và bỏ qua EVAL. Việc gõ là cơ bản, nhưng bạn có thể thấy đoạn được thừa hưởng từ phương thức S4 trong công việc như bài báo này có thể giúp bạn.
ex0du5

@ ex0du5: Cảm ơn, nhưng điều này không đủ xa, như tôi có thể nói. Chắc chắn, tôi có thể xây dựng mã theo nhiều giai đoạn khác nhau, nhưng dường như tôi không thể xé toạc các điều khoản. (Tôi sẽ đọc kỹ hơn, để xem tôi có bỏ sót điều gì không.)
Dave Clarke

Sơ đồ (không có tính đột biến và các biến chứng khác)?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Scheme là ngôn ngữ lập trình, không phải là phép tính. Hơn nữa, tôi không nghĩ rằng nó có thể làm những gì tôi muốn.
Dave Clarke

@DaveClarke Một ngôn ngữ lập trình là một phép tính với rất nhiều mụn cóc. Một lõi Scheme thoạt nhìn có vẻ phù hợp, nhưng tôi chưa đưa ra yêu cầu của bạn đủ để nghĩ chắc chắn. Bạn nghĩ gì sẽ không làm việc? (Hãy
ghé

Câu trả lời:


15

Jean Louis Krivine đã giới thiệu một phép tính trừu tượng mở rộng "Máy Krivine" theo cách rất không tầm thường (lưu ý rằng máy Krivine đã hỗ trợ lệnh gọi / cc từ lisp):

Ông giới thiệu một toán tử "trích dẫn" trong bài viết này được định nghĩa theo cách sau: nếu là một -term, lưu ý hình ảnh của bởi một số bijection từ thuật ngữ lambda đến số tự nhiên. Lưu ý số nhà thờ tương ứng với . Krivine định nghĩa toán tử theo quy tắc đánh giá: Tôi tin rằng thuật sĩ Kleene sẽ chỉ ra rằng điều này là đủ để làm những gì bạn muốn: nghĩa là xác định một trích dẫn và eval toán tử, nếu là tính toán được.bước sóng n φ φ pi : bước sóng N ¯ n n N χ χ φ φ ¯ n φ piϕλnϕϕπ:ΛNn¯nNχ

χ ϕϕ nϕ¯
π

Lưu ý rằng Krivine nổi tiếng là thách thức để đọc (xin đừng nổi giận nếu bạn đọc điều này, Jean-Louis!), Và một số nhà nghiên cứu đã thực hiện hành động từ thiện là cố gắng trích xuất nội dung kỹ thuật theo cách dễ đọc hơn. Bạn có thể thử xem những ghi chú này của Barshe Raffali.

Hi vọng điêu nay co ich!


Tôi nhận thấy rằng có một tài liệu tham khảo khác có thể phù hợp với sở thích của bạn: Tính toán mô hình thuần túy của Jay và Kesner chính thức hóa một biến thể của -calculus mở rộng sự trừu tượng đơn giản trên một biến thành một sự trừu tượng hóa trên một mô hình đại diện cho một mô hình tự tính toán. Đây là biểu hiện phi thường và đặc biệt cho phép người ta tự giải mã một ứng dụng: nếu tôi không nhầm, thuật ngữ:λ

(λ(x y).x)((λx.x x) (λy.y))

giảm xuống . Một lần nữa, tôi tin rằng điều này là quá đủ để thực hiện các toán tử trích dẫneval .λx.x x


Tôi muốn nêu lên câu trả lời có vẻ hợp lý này, nhưng tôi không biết liệu nó có bắt đầu trả lời câu hỏi không.
Raphael

@Raphael đọc các bài báo và tìm hiểu :) Trong thực tế, đây chỉ là một câu trả lời một phần: các bài viết thực sự chính thức hóa một tính năng quan trọng của lisp không tìm thấy trong phép tính lambda: cụ thể là toán tử QUOTE. Không có nghiên cứu siêu lý thuyết rộng rãi nào, họ chỉ giới thiệu nó như một phương tiện để thể hiện một loại tính toán không minh bạch kỳ lạ để nhận ra các tiên đề phức tạp của lý thuyết tập hợp.
cody

1
Nếu tôi nhớ chính xác, trong PPC, bạn không thể tạo mẫu khớp trên các redexes, lý do họ đưa ra là vì mục đích hợp lưu. Ngoài ra, trong PPC, khớp mẫu rất nghiêm ngặt đối với đối sánh, vì vậy sẽ ngay lập tức được chuẩn hóa thành , sau đó nỗ lực khớp nó với mẫu sẽ thất bại. (λx.x x) (λy.y)λy.y(x y)
ngày

1
Câu nói duy nhất tôi biết là của Lisp. Nhưng, như tôi nhớ, nó chỉ thay đổi bất cứ điều gì được trích dẫn thành một đối tượng cú pháp. "Hàm" lấy tham số của nó không được đánh giá .. Hàm Refl được cho là lấy giá trị của đối số của nó (đánh giá nó) và biến nó trở lại thành một biểu thức cú pháp đánh giá (làm thế nào?) đến giá trị đó. Vì vậy, nếu chủ nghĩa hình thức Krivine liên quan đến LISP , chúng ta sẽ không nhận được gì gần với những gì được đề xuất trong câu hỏi. quotereflectquote
babou

8

Làm như vậy là rất khó, nếu không phải là không thể, không từ bỏ hợp lưu. Điều đó có nghĩa là, tôi nghi ngờ bạn đúng về một siêu lý thuyết lông. Mặt khác, có thể thiết kế một phép tính tổ hợp có thể biểu thị tất cả các hàm tính toán có thể tính toán và có đầy đủ khả năng kiểm tra các thuật ngữ của nó: xem Jay và Give-Wilson .

Tuy nhiên, tôi tin rằng có khả năng này sẽ làm một số điều xấu đối với lý thuyết tương đương của bạn. Cụ thể, bạn sẽ có xu hướng chỉ có thể chứng minh hai giá trị bằng nhau nếu giá trị bằng với tương đương alpha.

Tôi chưa đọc cody giấy Krivine được liên kết đến, nhưng tôi cần lưu ý rằng trong logic cổ điển về cơ bản bạn chỉ có hai điều: đúng và sai. Tất cả mọi thứ là tương đương với một trong những. Đó là, bạn có xu hướng có một lý thuyết tương đương sụp đổ dù sao đi nữa.


1
Lưu ý rằng phép tính Krivine không phải là phép tính của các mệnh đề mà là sự thực hiện cho những điều này, có một lý thuyết phương trình không tầm thường.
cody

5

Trong lý thuyết về ngôn ngữ lập trình, tính năng bạn nói đến thường được gọi là "trích dẫn". Chẳng hạn, John Longley đã viết về nó trong một số tác phẩm của mình, xem bài báo này .

Nếu bạn chỉ sau khi cân nhắc về mặt lý thuyết (trái ngược với triển khai thực tế hữu ích) thì bạn có thể đơn giản hóa mọi thứ bằng cách nêu rằng quote(hoặc reflectnhư bạn gọi nó) ánh xạ vào loại số nguyên natbằng cách trả về mã của đối số. Sau đó, bạn có thể phân tách số giống như một cây cú pháp trừu tượng. Hơn nữa, bạn không cần evalbởi vì điều đó có thể được thực hiện bằng ngôn ngữ - về cơ bản nó là một trình thông dịch cho ngôn ngữ.

Đối với một mô hình cụ thể có các tính năng này, bạn có thể xem xét đại số kết hợp đầu tiên của Kleene: diễn giải mọi thứ dưới dạng số (nghĩ về chúng như mã Gôdel) và định nghĩa ứng dụng Kleene có nghĩa là trong đó là -theo chức năng một phần. Điều này sẽ cung cấp cho bạn một mô hình -calculus (với bản đồ một phần) trong đó đơn giản là chức năng nhận dạng. Không có thêm tính năng cần phải được thêm vào ngôn ngữ.nmφn(m)φnnλquote

Nếu bạn cho tôi biết những gì bạn đang theo đuổi, tôi có thể cung cấp cho bạn các tài liệu tham khảo cụ thể hơn.

Nhân tiện, đây là một vấn đề mở:

Làm phong phú -calculus (đánh máy hoặc tháo gỡ) mà là một sự phù hợp theo cách mà bạn bảo tồn -rule.λquoteξ

Các -rule nói rằng -abstraction là một tương đẳng. Nó cho phép chúng tôi giảm dưới để nói. Kết hợp với điều này cũng trở nên có vấn đề, vì được cho là cũng đồng dạng, vì vậy ví dụ như chúng tôi thấy rằng đó phải là trường hợp Vì vậy, bằng cách nào đó, điều này được cho là để tính toán mã Gotdel "rất chuẩn" - nhưng thậm chí giả sử chúng ta có một đã gõξ bước sóngbước sónge1e2

e1e2λx.e1λx.e2
λλquotequotequote
e1e2quotee1quotee2,
λ
quote((λx.x)y)quotey.
quoteλ-calculus mà không có đệ quy điều này dường như là khó thực hiện.

Tất nhiên là có -conversion ở đó. Tôi cho rằng lẽ ra tôi phải nói rằng đó phải là sự phù hợp cho tất cả các quy tắc của -calculus, nhưng đặc biệt là -rule rất khó bảo tồn. bước sóng ξβquoteλξ
Andrej Bauer

Các -rule và -rule là độc lập với nhau. Xin đừng nhầm lẫn lý thuyết tương đương với các hóa thân thuật toán cụ thể của nó. βξβ
Andrej Bauer

Bài viết sau đây cho thấy một số vấn đề với phương trình (ξ): Phép tính Lambda là Đại số, Peter Selinger. Thật thú vị, một cái gì đó mới tôi đã không biết! Mát mẻ.
Số vô hạn

4

Đây là một câu trả lời thay thế, thay vì sử dụng phương pháp tiếp cận danh nghĩa của tôi vẫn đang thử nghiệm, có một số cách tiếp cận được thiết lập hơn quay trở lại bài báo:

LEAP: Một ngôn ngữ với sự đa hình và đa hình
Frank Pfenning và Peter Lee
https://www.cs.cmu.edu/~fp/ con / tapsoft89.pdf

Bài viết bắt đầu bằng:

Điều này sau đó dẫn chúng ta đến câu hỏi, lần đầu tiên được đặt ra bởi Reynold, về việc liệu các ngôn ngữ được gõ mạnh có thừa nhận các thông dịch viên vòng tròn hay không. Sự khôn ngoan thông thường dường như chỉ ra rằng câu trả lời là "Không". Câu trả lời của chúng tôi là "Hầu như".

Xin lưu ý rằng LEAP mạnh hơn nhiều so với những gì OP muốn. Trước hết nó được gõ. Và thứ hai, nó yêu cầu siêu vòng tròn, có nghĩa là ví dụ rằng eval có thể thực hiện định nghĩa riêng của nó. Trong Prolog, bạn nhận được metacircularity để giải quyết / 1:

solve(true).
solve((A,B)) :- solve(A), solve(B).
solve(H) :- clause(H,B), solve(B).

Nếu bạn thêm mệnh đề sau để giải / 1:

solve(clause(H,B)) :- clause(H,B).

Và nếu bạn thấy nó, mệnh đề / 2 cũng trả về các mệnh đề của giải / 1. Sau đó, bạn có thể gọi giải quyết (giải quyết (...)) và xem cách giải quyết thực thi chính nó.

Các câu hỏi về tự đại diện vẫn thúc đẩy một số nghiên cứu, xem ví dụ:

Tự đại diện trong Hệ thống Girards U
Matt Brown, Jens Palsberg
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf


3

Vấn đề được xác định trong sự khôn ngoan của các trợ lý chứng minh như Coq và Isabelle / HOL. Nó đi theo từ viết tắt HOAS . Có một số tuyên bố xung quanh-Prolog rằng thông qua bộ định lượng new mới, những điều như vậy có thể được thực hiện. Nhưng tôi không thể hiểu được yêu cầu này. Tôi đoán rằng cái nhìn sâu sắc chính mà tôi có được cho đến nay là không có cách tiếp cận nhất định, có một vài cách tiếp cận có thể.

Bản thân tôi, chưa hoàn thành , được lấy cảm hứng từ một bài báo gần đây của Paulson về việc chứng minh sự không hoàn hảo của Gôdels. Tôi sẽ sử dụng các chất kết dính cấp đối tượng liên quan đến một số cấu trúc dữ liệu có tên cấp độ meta. Về cơ bản, cấu trúc dữ liệu tương tự nhưng khác biệt như cấu trúc từ OP và với mã hóa Church vì tôi quan tâm đến các loại phụ thuộc:

datatype Expr = var Name                 /* written as n */
              | app Expr Expr            /* written as s t */
              | abs Name Expr Expr       /* written as λn:s.t */

Các biểu thức mức meta có thể được phân biệt với các biểu thức mức đối tượng ở chỗ chúng ta sử dụng các tên biến n, m, .. vv .. để biểu thị tên. Trong khi đó chúng ta sử dụng các tên biến x, y, .. vv .. ở cấp độ đối tượng. Việc giải thích một thuật ngữ meta trong logic đối tượng sau đó sẽ hoạt động như sau. Hãy viết [t] cho việc giải thích thuật ngữ danh nghĩa t trong ngữ cảnh danh nghĩa, sẽ đưa ra một thuật ngữ đối tượng. Sau đó chúng ta sẽ có:

 [n]σ = lookup σ n
 [s t]σ = [s]σ [t]σ
 [λn:s.t]σ = λx:[s]σ.[t]σ,n:x

Ở trên sẽ xác định những gì OP gọi là hàm EVAL. Khác biệt nhỏ với Paulson, chỉ là một danh sách hữu hạn và không phải là một chức năng. Theo tôi, chỉ có thể giới thiệu chức năng EVAL chứ không phải chức năng REFLECT. Vì ở cấp độ đối tượng, bạn có thể có một số đẳng thức để các biểu thức lambda khác nhau giống nhau. Những gì bạn phải làm là sử dụng eval để lý luận cũng có thể về sự phản ánh nếu bạn cảm thấy cần thiết.

Bạn sẽ cần phải đi đến các thái cực như Prolog, nơi không có gì được mở rộng, nếu bạn muốn phá bỏ bức tường giữa danh nghĩa và không danh nghĩa. Nhưng như ví dụ về hệ thống λ-Prolog cho thấy, trong trường hợp bậc cao hơn, có những vấn đề bổ sung mà ví dụ chỉ có thể khắc phục bằng cách logic bằng cách đưa ra các phương tiện mới như bộ định lượng!

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.