Những điểm tương đương thú vị nhất nảy sinh từ thuyết Isomorphism của Curry-Howard là gì?


97

Tôi đến với Thuyết Isomorphism Curry-Howard tương đối muộn trong cuộc đời lập trình của mình, và có lẽ điều này góp phần khiến tôi hoàn toàn bị cuốn hút bởi nó. Nó ngụ ý rằng đối với mọi khái niệm lập trình đều tồn tại một tương tự chính xác trong logic hình thức và ngược lại. Dưới đây là danh sách "cơ bản" của các phép loại suy như vậy, tôi không biết:

program/definition        | proof
type/declaration          | proposition
inhabited type            | theorem/lemma
function                  | implication
function argument         | hypothesis/antecedent
function result           | conclusion/consequent
function application      | modus ponens
recursion                 | induction
identity function         | tautology
non-terminating function  | absurdity/contradiction
tuple                     | conjunction (and)
disjoint union            | disjunction (or)          -- corrected by Antal S-Z
parametric polymorphism   | universal quantification

Vì vậy, đối với câu hỏi của tôi: một số hàm ý thú vị / khó hiểu hơn của thuyết đẳng cấu này là gì? Tôi không phải là nhà logic học vì vậy tôi chắc chắn rằng tôi chỉ mới sơ khai với danh sách này.

Ví dụ: đây là một số khái niệm lập trình mà tôi không biết về các tên dễ hiểu trong logic:

currying                  | "((a & b) => c) iff (a => (b => c))"
scope                     | "known theory + hypotheses"

Và đây là một số khái niệm logic mà tôi chưa hiểu rõ về thuật ngữ lập trình:

primitive type?           | axiom
set of valid programs?    | theory

Biên tập:

Dưới đây là một số điểm tương đương khác được thu thập từ các câu trả lời:

function composition      | syllogism                -- from Apocalisp
continuation-passing      | double negation          -- from camccann

đóng cửa ~ = tập các tiên đề
Apocalisp

+1 Câu hỏi này và tất cả các câu trả lời và nhận xét chất lượng đã dạy tôi về CHI nhiều hơn những gì tôi có thể học qua internet.
Alexandre C.

24
@Paul Nathan:goto | jumping to conclusions
Joey Adams

Tôi nghĩ rằng các thiết lập của tất cả các chương trình hợp lệ sẽ là một mô hình
Daniil

1
fst / snd | liên kết elimiation, Left / Right | giới thiệu disjunction
Tony Morris

Câu trả lời:


33

Vì bạn đã yêu cầu rõ ràng những điều thú vị và ít người biết đến:

Bạn có thể mở rộng CH cho nhiều logic và công thức logic thú vị để có được nhiều loại tương ứng thực sự. Ở đây, tôi đã cố gắng tập trung vào một số điều thú vị hơn là vào điều tối nghĩa, cộng với một số điều cơ bản chưa được đưa ra.

evaluation             | proof normalisation/cut-elimination
variable               | assumption
S K combinators        | axiomatic formulation of logic   
pattern matching       | left-sequent rules 
subtyping              | implicit entailment (not reflected in expressions)
intersection types     | implicit conjunction
union types            | implicit disjunction
open code              | temporal next
closed code            | necessity
effects                | possibility
reachable state        | possible world
monadic metalanguage   | lax logic
non-termination        | truth in an unobservable possible world
distributed programs   | modal logic S5/Hybrid logic
meta variables         | modal assumptions
explicit substitutions | contextual modal necessity
pi-calculus            | linear logic

CHỈNH SỬA: Một tài liệu tham khảo mà tôi muốn giới thiệu cho bất kỳ ai quan tâm đến việc tìm hiểu thêm về các phần mở rộng của CH:

"Tái cấu trúc Phán đoán của Logic Phương thức" http://www.cs.cmu.edu/~fp/papers/mscs00.pdf - đây là một nơi tuyệt vời để bắt đầu vì nó bắt đầu từ những nguyên tắc đầu tiên và phần lớn mục đích của nó là có thể tiếp cận với những người không phải là nhà logic / nhà lý thuyết ngôn ngữ. (Tôi là tác giả thứ hai, vì vậy tôi thiên vị.)


cảm ơn vì đã cung cấp một số ví dụ ít tầm thường hơn (đó thực sự là tinh thần của câu hỏi ban đầu), mặc dù tôi thừa nhận một số trong số này nằm trong đầu ... các thuật ngữ "cần thiết" và "khả năng" có được định nghĩa chính xác trong logic không? làm thế nào để họ dịch sang các tương đương tính toán của họ?
Tom Crockett

2
Tôi có thể chỉ vào các bài báo đã xuất bản cho từng cái này, vì vậy chúng được xác định chính xác. Logic phương thức được nghiên cứu nhiều (kể từ Aristotle) ​​và liên quan đến các phương thức chân lý khác nhau - "A nhất thiết đúng" nghĩa là "trong mọi thế giới có thể A là đúng", trong khi "A có thể đúng" nghĩa là "A là đúng trong một thế giới có thể" . Bạn có thể chứng minh những điều như "(nhất thiết (A -> B) và có thể là A) -> có thể là B". Các quy tắc suy luận phương thức trực tiếp mang lại các quy tắc xây dựng biểu thức, nhập và rút gọn, như thường lệ trong CH. Xem: en.wikipedia.org/wiki/Modal_logiccs.cmu.edu/~fp/papers/mscs00.pdf
RD1,

2
@pelotom: Bạn có thể muốn đọc một chút về các loại logic khác . Logic cổ điển thuần túy thường không hữu ích trong bối cảnh này - tôi đã đề cập đến logic trực giác trong câu trả lời của mình, nhưng logic phương thứctuyến tính thậm chí còn "kỳ quặc" hơn, nhưng cũng thực sự tuyệt vời.
CA McCann

1
Cảm ơn vì những gợi ý, có vẻ như tôi có một số bài đọc phải làm!
Tom Crockett,

2
@ RD1: Bạn nghĩ điều đó thật tệ, tôi đã dành rất nhiều thời gian để suy nghĩ trong Haskell đến nỗi tôi phải tính nhẩm các công thức logic vị từ thành các chữ ký kiểu trước khi chúng có ý nghĩa. :( Chưa kể rằng luật pháp của loại trừ bắt đầu giữa và như vậy có vẻ thực sự bối rối và có lẽ đáng ngờ.
CA McCann

26

Bạn đang bối rối một chút mọi thứ liên quan đến việc đề cử. Sự giả dối được đại diện bởi các loại không có người sử dụng , theo định nghĩa không thể là không chấm dứt vì không có gì thuộc loại đó để đánh giá ngay từ đầu.

Tính không kết thúc thể hiện sự mâu thuẫn - một logic không nhất quán. Tuy nhiên, một logic không nhất quán sẽ cho phép bạn chứng minh bất cứ điều gì , kể cả sự giả dối.

Bỏ qua những mâu thuẫn, các hệ thống kiểu thường tương ứng với logic trực giác , và về mặt kiến tạo cần thiết , có nghĩa là một số phần của logic cổ điển không thể được diễn đạt trực tiếp, nếu có. Mặt khác, điều này rất hữu ích, bởi vì nếu một kiểu là một bằng chứng xây dựng hợp lệ, thì một thuật ngữ của kiểu đó là một phương tiện để xây dựng bất cứ thứ gì bạn đã chứng minh sự tồn tại của nó .

Một đặc điểm chính của hương vị kiến ​​tạo là phủ định kép không tương đương với không phủ định. Trên thực tế, phủ định hiếm khi là nguyên thủy trong một hệ thống kiểu, vì vậy thay vào đó, chúng ta có thể biểu diễn nó như là ngụ ý về sự giả dối, ví dụ, not Ptrở thành P -> Falsity. Do đó, phủ định kép sẽ là một hàm với kiểu (P -> Falsity) -> Falsity, rõ ràng không tương đương với một cái gì đó chỉ kiểu P.

Tuy nhiên, có một sự thay đổi thú vị về điều này! Trong một ngôn ngữ có tính đa hình tham số, các biến kiểu có phạm vi trên tất cả các kiểu có thể có, kể cả những kiểu không có người sử dụng, vì vậy, kiểu đa hình hoàn toàn ∀a. a, theo một nghĩa nào đó, gần như là sai. Vậy điều gì sẽ xảy ra nếu chúng ta viết phủ định gần như kép bằng cách sử dụng tính đa hình? Chúng tôi nhận được một loại trông như thế này: ∀a. (P -> a) -> a. Điều đó có tương đương với một cái gì đó thuộc loại Pkhông? Thật vậy, nó chỉ là áp dụng nó cho chức năng nhận dạng.

Nhưng vấn đề là gì? Tại sao lại viết một kiểu như vậy? Nó có ý nghĩa gì trong thuật ngữ lập trình không? Chà, bạn có thể nghĩ về nó như một hàm đã có sẵn kiểu gì Pđó ở đâu đó và cần bạn cung cấp cho nó một hàm nhận Plàm đối số, với toàn bộ điều này là đa hình trong kiểu kết quả cuối cùng. Theo một nghĩa nào đó, nó đại diện cho một tính toán bị treo , chờ phần còn lại được cung cấp. Theo nghĩa này, các tính toán bị treo này có thể được soạn cùng nhau, truyền xung quanh, gọi, bất cứ điều gì. Điều này sẽ bắt đầu nghe quen thuộc với người hâm mộ một số ngôn ngữ, như Scheme hoặc Ruby - vì nó có nghĩa là phủ định kép tương ứng với kiểu chuyển tiếp nối tiếp, và trên thực tế, loại mà tôi đưa ra ở trên chính xác là đơn nguyên tiếp tục trong Haskell.


Cảm ơn vì sự sửa chữa, tôi đã loại bỏ "falsity" như một từ đồng nghĩa của sự đề cử. +1 cho phủ định kép <=> CPS!
Tom Crockett

Tôi không hoàn toàn hiểu được trực giác đằng sau việc đại diện cho ¬p là P -> Falsity. Tôi hiểu tại sao nó hoạt động (¬p ≡ p → ⊥), nhưng tôi không nhận được phiên bản mã. P -> ⊥nên được sinh sống chính xác khi nào Pkhông, phải không? Nhưng không phải lúc nào chức năng này cũng có người ở? Hoặc có thể không bao giờ, thực sự, vì bạn không thể trả về một phiên bản của ? Tôi không hoàn toàn thấy điều kiện của nó. Trực giác ở đây là gì?
Antal Spector-Zabusky

1
@Antal SZ: Tất nhiên, trực giác là logic của trực giác! Nhưng có, thực sự viết một hàm như vậy rất khó. Tôi thấy trong hồ sơ của bạn rằng bạn biết Haskell, vì vậy có thể bạn đang nghĩ về kiểu dữ liệu đại số và đối sánh mẫu? Hãy xem xét rằng một kiểu không có người sử dụng phải không có hàm tạo và do đó, không có gì để mẫu phù hợp với. Bạn phải viết một "hàm" không có nội dung, điều này không hợp pháp Haskell. Trên thực tế, theo hiểu biết của tôi, không có cách nào để viết một thuật ngữ thuộc loại phủ định trong Haskell mà không sử dụng ngoại lệ thời gian chạy hoặc không kết thúc.
CA McCann

1
@Antal SZ: Mặt khác, nếu logic tương đương nhất quán, tất cả các hàm phải là tổng, ví dụ: tất cả các đối sánh mẫu phải đầy đủ. Vì vậy, để viết một hàm không có mẫu, kiểu tham số phải không có hàm tạo, ví dụ: không có hàm tạo. Do đó, một chức năng như vậy sẽ là hợp pháp - và do đó, kiểu riêng của nó có người ở - chính xác và chỉ khi đối số của nó không có người ở. Do đó, một hàm P -> Falsitytương đương với Psai.
CA McCann

Aha, tôi nghĩ tôi hiểu rồi. Phiên bản mà tôi đã từng giải trí là một cái gì đó giống như f x = x, có thể bắt đầu ngay lập tức P = ⊥, nhưng điều đó rõ ràng là không đủ chung chung. Vì vậy, ý tưởng là để trả lại một loại vô giá trị, bạn không cần cơ thể; nhưng để hàm có thể xác định được và toàn bộ, bạn không cần trường hợp nào , và vì vậy nếu Pkhông có người ở, mọi thứ sẽ hoạt động tốt? Đó là một chút khó khăn, nhưng tôi nghĩ tôi thấy nó. Điều đó có vẻ tương tác khá kỳ lạ với định nghĩa của tôi về Xorloại người… Tôi sẽ phải suy nghĩ về điều đó. Cảm ơn!
Antal Spector-Zabusky

15

Biểu đồ của bạn không đúng lắm; trong nhiều trường hợp bạn nhầm lẫn giữa các loại với các thuật ngữ.

function type              implication
function                   proof of implication
function argument          proof of hypothesis
function result            proof of conclusion
function application RULE  modus ponens
recursion                  n/a [1]
structural induction       fold (foldr for lists)
mathematical induction     fold for naturals (data N = Z | S N)
identity function          proof of A -> A, for all A
non-terminating function   n/a [2]
tuple                      normal proof of conjunction
sum                        disjunction
n/a [3]                    first-order universal quantification
parametric polymorphism    second-order universal quantification
currying                   (A,B) -> C -||- A -> (B -> C), for all A,B,C
primitive type             axiom
types of typeable terms    theory
function composition       syllogism
substitution               cut rule
value                      normal proof

[1] Logic cho một ngôn ngữ chức năng hoàn chỉnh Turing là không nhất quán. Đệ quy không có sự tương ứng trong các lý thuyết nhất quán. Trong một lý thuyết logic không nhất quán / lý thuyết chứng minh không chắc chắn, bạn có thể gọi nó là một quy tắc gây ra sự mâu thuẫn / không chắc chắn.

[2] Một lần nữa, đây là hệ quả của sự đầy đủ. Đây sẽ là một bằng chứng phản định lý nếu logic nhất quán - do đó, nó không thể tồn tại.

[3] Không tồn tại trong các ngôn ngữ hàm, vì chúng làm sáng tỏ các đặc điểm logic bậc nhất: tất cả việc định lượng và tham số đều được thực hiện qua các công thức. Nếu bạn có tính năng bậc nhất, sẽ có một loại khác hơn *, * -> *, vv .; loại yếu tố của miền nghị luận. Ví dụ, trong Father(X,Y) :- Parent(X,Y), Male(X), XYphạm vi trong lĩnh vực giảng (gọi nó Dom), và Male :: Dom -> *.


[1] - vâng, tôi nên nói cụ thể hơn. Ý tôi là "đệ quy cấu trúc" chứ không phải đệ quy không bị giới hạn, mà tôi đoán là giống như "nếp gấp". [3] - nó tồn tại trong các ngôn ngữ được đánh máy phụ thuộc
Tom Crockett

[1] Thực tế là nếu một lệnh gọi hàm đệ quy (modus ponens) không khiến chương trình không kết thúc, các tham số (giả thuyết) được cung cấp cho lời gọi hoặc môi trường PHẢI khác nhau giữa các lệnh gọi đó. Vì vậy, đệ quy chỉ là áp dụng cùng một định lý nhiều lần. Nếu có điều gì đặc biệt, nó thường là số tăng / giảm (bước quy nạp) và kiểm tra với một trường hợp hiện có (trường hợp cơ sở), tương ứng với - Quy nạp toán học trong logic.
Động cơ Trái đất vào

Tôi thực sự thích biểu đồ này, nhưng tôi sẽ không nói "n / a", vì logic nhất quán không phải là loại logic duy nhất, cũng như các chương trình kết thúc không phải là loại chương trình duy nhất. Một hàm không kết thúc sẽ tương ứng với một "đối số vòng tròn" và là một minh họa tuyệt vời cho phép đẳng cấu Curry-Howard: "theo sau" một đối số vòng tròn đưa bạn vào một vòng lặp vô tận.
Joey Adams


13

Tôi thực sự thích câu hỏi này. Tôi không biết nhiều, nhưng tôi có một vài điều (được hỗ trợ bởi bài báo Wikipedia , có một số bảng gọn gàng và chính nó):

  1. Tôi nghĩ rằng các kiểu tổng / kiểu kết hợp ( ví dụ data Either a b = Left a | Right b ) tương đương với phép kết hợp bao hàm . Và, mặc dù tôi không quen lắm với Curry-Howard, tôi nghĩ điều này chứng tỏ điều đó. Hãy xem xét chức năng sau:

    andImpliesOr :: (a,b) -> Either a b
    andImpliesOr (a,_) = Left a
    

    Nếu tôi hiểu mọi thứ một cách chính xác, thì kiểu nói rằng ( a  ∧  b ) → ( a  ★  b ) và định nghĩa nói rằng điều này là đúng, trong đó ★ là bao gồm hoặc độc quyền hoặc, tùy theo cái nào Eitherđại diện. Bạn có Eitherđại diện độc quyền hoặc, ⊕; tuy nhiên, ( a  ∧  b ) ↛ ( a  ⊕  b ). Ví dụ: ⊤ ∧ ⊤ ≡ ⊤, nhưng ⊤ ⊕ ⊥ ≡ ⊥ và ⊤ ↛ ⊥. Nói cách khác, nếu cả ab đều đúng, thì giả thuyết là đúng nhưng kết luận là sai, và do đó hàm ý này phải là sai. Tuy nhiên, rõ ràng, ( a  ∧  b ) → ( a  ∨ b ), vì nếu cả ab đều đúng thì ít nhất một đúng. Vì vậy, nếu các công đoàn bị phân biệt đối xử là một số hình thức phân biệt, thì chúng phải là sự đa dạng bao trùm. Tôi nghĩ điều này được coi là một bằng chứng, nhưng tôi không nên bỏ qua khái niệm này.

  2. Tương tự như vậy, các định nghĩa của bạn về tính kéo dài và tính vô lý như là hàm nhận dạng và hàm không kết thúc, tương ứng, hơi sai. Công thức true được biểu thị bằng kiểu đơn vị , là kiểu chỉ có một phần tử ( data ⊤ = ⊤; thường được đánh vần ()và / hoặc Unittrong các ngôn ngữ lập trình hàm). Điều này có ý nghĩa: vì loại đó được đảm bảo là có người ở, và vì chỉ có một người có thể sinh sống nên nó phải là sự thật. Hàm nhận dạng chỉ đại diện cho phép tính cụ thể mà a  →  a .

    Nhận xét của bạn về các chức năng không kết thúc, tùy thuộc vào ý bạn chính xác là gì, nhiều hơn. Curry-Howard hoạt động trên hệ thống loại, nhưng không kết thúc không được mã hóa ở đó. Theo Wikipedia , xử lý không chấm dứt là một vấn đề, vì việc thêm nó tạo ra lôgic không nhất quán ( ví dụ , tôi có thể xác định wrong :: a -> bbằng cách wrong x = wrong x, và do đó "chứng minh" rằng a  →  b cho bất kỳ ab ). Nếu đây là những gì bạn có nghĩa là "vô lý", thì bạn chính xác là đúng. Nếu thay vào đó, bạn có ý định tuyên bố sai, thì những gì bạn muốn thay vào đó là bất kỳ loại không có người ở nào, ví dụ như thứ gì đó được xác định bởidata ⊥—Đó là, một kiểu dữ liệu mà không có cách nào để xây dựng nó. Điều này đảm bảo rằng nó không có giá trị nào cả và vì vậy nó phải không có người ở, tương đương với false. Tôi nghĩ rằng bạn có thể cũng có thể sử dụng a -> b, vì nếu chúng tôi cấm các chức năng không kết thúc, thì nó cũng không có người ở, nhưng tôi không chắc chắn 100%.

  3. Wikipedia cho biết các tiên đề được mã hóa theo hai cách khác nhau, tùy thuộc vào cách bạn diễn giải Curry-Howard: trong tổ hợp hoặc trong các biến. Tôi nghĩ rằng chế độ xem tổ hợp có nghĩa là các hàm nguyên thủy mà chúng ta được cung cấp mã hóa những thứ chúng ta có thể nói theo mặc định (tương tự như cách mà modus ponens là một tiên đề vì ứng dụng hàm là nguyên thủy). Và tôi nghĩ rằng chế độ xem biến thực sự có thể có ý nghĩa tương tự — xét cho cùng, các tổ hợp chỉ là các biến toàn cục là các hàm cụ thể. Đối với các kiểu nguyên thủy: nếu tôi đang nghĩ về điều này một cách chính xác, thì tôi nghĩ rằng các kiểu nguyên thủy là các thực thể — các đối tượng nguyên thủy mà chúng tôi đang cố gắng chứng minh mọi thứ.

  4. Theo logic và lớp ngữ nghĩa của tôi, thực tế là ( a  ∧  b ) →  c  ≡  a  → ( b  →  c ) (và cả b  → ( a  →  c )) được gọi là luật tương đương xuất khẩu, ít nhất là trong suy luận tự nhiên các bằng chứng. Lúc đó tôi không để ý rằng nó chỉ là cà ri - tôi ước gì có, bởi vì điều đó thật tuyệt!

  5. Mặc dù hiện tại chúng tôi có cách thể hiện sự khác biệt bao hàm , nhưng chúng tôi không có cách nào để đại diện cho sự đa dạng độc quyền. Chúng ta có thể sử dụng định nghĩa của phép tách biệt để biểu diễn nó: a  ⊕  b  ≡ ( a  ∨  b ) ∧ ¬ ( a  ∧  b ). Tôi không biết làm thế nào để viết phủ định, nhưng tôi biết rằng ¬ p  ≡  p  → ⊥, và cả hàm ý và giả dối đều dễ dàng. Do đó, chúng tôi có thể thể hiện sự khác biệt độc quyền bằng cách:

    data ⊥
    data Xor a b = Xor (Either a b) ((a,b) -> ⊥)
    

    Điều này định nghĩa là kiểu trống không có giá trị, tương ứng với giả mạo; Xorsau đó được định nghĩa để chứa cả ( ) Eithermột một hoặc một b ( hoặc ) và một hàm ( hàm ý ) từ (a, b) ( ) để loại đáy ( sai ). Tuy nhiên, tôi không biết điều này có nghĩa là gì . ( Chỉnh sửa 1: Bây giờ tôi làm, hãy xem đoạn tiếp theo!) Vì không có giá trị của kiểu (a,b) -> ⊥(có không?), Tôi không thể hiểu điều này có nghĩa là gì trong một chương trình. Có ai biết cách tốt hơn để nghĩ về định nghĩa này hay định nghĩa khác không? ( Chỉnh sửa 1: Vâng, camccann .)

    Chỉnh sửa 1: Cảm ơn câu trả lời của camccann (đặc biệt hơn là những bình luận mà anh ấy để lại trên đó để giúp tôi), tôi nghĩ rằng tôi đã hiểu chuyện gì đang xảy ra ở đây. Để xây dựng một giá trị của kiểu Xor a b, bạn cần cung cấp hai điều. Đầu tiên, một nhân chứng cho sự tồn tại của một phần tử của một trong hai ahoặc bnhư là đối số đầu tiên; đó là, a Left ahoặc a Right b. Và thứ hai, một bằng chứng rằng không có yếu tố của cả hai loại ab— nói cách khác, một bằng chứng (a,b)không có người ở — như là lập luận thứ hai. Vì bạn sẽ chỉ có thể viết một hàm từ (a,b) -> ⊥nếu (a,b)không có người ở, điều đó có nghĩa là gì đối với trường hợp đó? Điều đó có nghĩa là một số phần của một đối tượng thuộc loại(a,b)không thể được xây dựng; nói cách khác, ít nhất một, và có thể cả hai, abcũng không có người ở! Trong trường hợp này, nếu chúng ta đang nghĩ về đối sánh mẫu, bạn không thể khớp mẫu trên một bộ như vậy: giả sử nó bkhông có người ở, chúng ta sẽ viết gì có thể khớp với phần thứ hai của bộ này? Do đó, chúng tôi không thể tìm mẫu phù hợp với nó, điều này có thể giúp bạn hiểu tại sao điều này khiến nó không có người ở. Bây giờ, cách duy nhất để có một hàm tổng không có đối số (vì hàm này phải, vì (a,b)không có đối số) là kết quả cũng thuộc loại không có đối số — nếu chúng ta đang nghĩ về điều này từ góc độ đối sánh mẫu, điều này có nghĩa rằng mặc dù các chức năng không có trường hợp, không có khả năng cơ thể nó có thể có một trong hai, và vì vậy mọi thứ đều ổn.

Phần lớn điều này là tôi đang nghĩ to / chứng minh (hy vọng) mọi thứ đang bay, nhưng tôi hy vọng nó hữu ích. Tôi thực sự giới thiệu bài viết trên Wikipedia ; Tôi chưa đọc qua nó một cách chi tiết, nhưng các bảng của nó là một bản tóm tắt thực sự hay và nó rất kỹ lưỡng.


1
+1 để chỉ ra rằng Hoặc là bao gồm-hoặc. Lưu ý rằng (Hoặc aa) là một định lý (với mọi a).
Apocalisp

Câu hỏi lại. 2 (b): sự khác biệt giữa loại chức năng có cư dân duy nhất là không kết thúc và loại chức năng không có người ở là gì? Ví dụ: nếu tôi khai báo kiểu B không có hàm tạo, thì hãy định nghĩa một hàm A-> B như sau: fun (a: A): B: = f (a) điều này sẽ đánh máy bằng nhiều ngôn ngữ, mặc dù nó Không thể bao giờ trả về điểm B. Vì vậy, hàm là "cư dân" theo một nghĩa nào đó, nhưng "cư dân" của nó là vô lý ... vì vậy nó không thực sự có cư dân. Hy vọng điều này làm cho một số loại cảm giác :)
Tom Crockett

3
Dưới cùng không phải là bằng chứng. "Thật vô lý và không thể cho rằng cái không thể biết và không xác định phải chứa đựng và xác định." - Aristoteles
Apocalisp

2
@Tom: Chỉ cần lái xe về nhà là không kết thúc, nếu logic nhất quán, tất cả các chương trình sẽ chấm dứt . Không kết thúc chỉ xảy ra trong các hệ thống kiểu đại diện cho lôgic không nhất quán, hoặc tương đương, hệ thống kiểu cho các ngôn ngữ hoàn chỉnh Turing.
CA McCann

1
Apocalisp: Either a a không hẳn là một định lý: Either ⊥ ⊥vẫn chưa có người ở. Tom: Như camccann đã nói, tính nhất quán có nghĩa là chấm dứt. Do đó, một hệ thống loại nhất quán sẽ không cho phép bạn thể hiện f :: a -> bvà vì vậy loại sẽ không có người ở; một hệ thống kiểu không nhất quán sẽ có một cư dân cho kiểu, nhưng một hệ thống sẽ không kết thúc. camccann: Có hệ thống loại không nhất quán nào không hoàn chỉnh Turing, chiếm một số điểm ở giữa trên hệ thống phân cấp không? Hay là bước cuối cùng (thêm đệ quy tổng quát hoặc bất cứ điều gì) chính xác tương đương với sự không nhất quán?
Antal Spector-Zabusky

12

Đây là một điều hơi tối nghĩa mà tôi ngạc nhiên là không được đưa ra trước đó: lập trình phản ứng chức năng "cổ điển" tương ứng với logic thời gian.

Tất nhiên, trừ khi bạn là một triết gia, nhà toán học hoặc lập trình viên chức năng bị ám ảnh, điều này có thể đưa ra nhiều câu hỏi hơn.

Vì vậy, trước hết: lập trình phản ứng chức năng là gì? Đó là một cách khai báo để làm việc với các giá trị thay đổi theo thời gian . Điều này hữu ích cho việc viết những thứ như giao diện người dùng vì đầu vào từ người dùng là các giá trị thay đổi theo thời gian. FRP "cổ điển" có hai kiểu dữ liệu cơ bản: sự kiện và hành vi.

Sự kiện đại diện cho các giá trị chỉ tồn tại ở những thời điểm riêng biệt. Tổ hợp phím là một ví dụ tuyệt vời: bạn có thể coi các đầu vào từ bàn phím như một ký tự tại một thời điểm nhất định. Mỗi lần nhấn phím sau đó chỉ là một cặp ký tự của phím và thời gian nó được nhấn.

Hành vi là những giá trị tồn tại liên tục nhưng có thể thay đổi liên tục. Vị trí chuột là một ví dụ tuyệt vời: nó chỉ là một hành vi của tọa độ x, y. Rốt cuộc, chuột luôn có một vị trí và về mặt khái niệm, vị trí này thay đổi liên tục khi bạn di chuyển chuột. Rốt cuộc, di chuyển chuột là một hành động kéo dài duy nhất, không phải là một loạt các bước rời rạc.

Và logic thời gian là gì? Một cách thích hợp, đó là một tập hợp các quy tắc logic để xử lý các mệnh đề được định lượng theo thời gian. Về cơ bản, nó mở rộng logic bậc nhất thông thường với hai định lượng: □ và ◇. Đầu tiên có nghĩa là "luôn luôn": đọc □ φ là "φ luôn giữ". Thứ hai là "cuối cùng": ◇ φ có nghĩa là "φ cuối cùng sẽ giữ". Đây là một loại logic phương thức cụ thể . Hai định luật sau liên quan đến các định lượng:

□φ ⇔ ¬◇¬φ
◇φ ⇔ ¬□¬φ

Vì vậy, □ và ◇ là đối ngẫu của nhau theo cách giống như ∀ và ∃.

Hai định lượng này tương ứng với hai loại trong FRP. Đặc biệt, □ tương ứng với hành vi và ◇ tương ứng với sự kiện. Nếu chúng ta nghĩ về cách những loại này sinh sống, thì điều này sẽ có ý nghĩa: một hành vi được sinh sống tại mọi thời điểm có thể, trong khi một sự kiện chỉ xảy ra một lần.


8

Liên quan đến mối quan hệ giữa tính liên tục và phủ định kép, kiểu gọi / cc là định luật của Peirce http://en.wikipedia.org/wiki/Call-with-current-continuation

CH thường được phát biểu là sự tương ứng giữa logic trực giác và chương trình. Tuy nhiên, nếu chúng ta thêm toán tử gọi-với-hiện tại-tiếp tục (callCC) (có kiểu tương ứng với định luật Peirce), chúng ta sẽ có được sự tương ứng giữa logic cổ điển và các chương trình với callCC.


4

Mặc dù nó không phải là một phép đẳng cấu đơn giản, nhưng cuộc thảo luận về LEM mang tính xây dựng này là một kết quả rất thú vị. Đặc biệt, trong phần kết luận, Oleg Kiselyov thảo luận về cách sử dụng các đơn nguyên để loại bỏ phủ định kép trong logic xây dựng tương tự như việc phân biệt các mệnh đề có thể quyết định được bằng máy tính (mà LEM hợp lệ trong một thiết lập xây dựng) từ tất cả các mệnh đề. Khái niệm rằng các monads nắm bắt các hiệu ứng tính toán là một quan điểm cũ, nhưng trường hợp này của phép đồng cấu Curry - Howard giúp đưa nó vào quan điểm và giúp hiểu được phủ định kép thực sự "nghĩa là gì".


4

Hỗ trợ liên tục hạng nhất cho phép bạn thể hiện $ P \ lor \ neg P $. Bí quyết dựa trên thực tế là không gọi phần tiếp diễn và thoát ra bằng một biểu thức nào đó tương đương với việc gọi phần tiếp theo với cùng một biểu thức đó.

Để xem chi tiết hơn, vui lòng xem: http://www.cs.cmu.edu/~rwh/courses/logic/www-old/handouts/callcc.pdf


Cảm ơn vì cái nhìn sâu sắc đó!
paulotorrens

4
2-continuation           | Sheffer stoke
n-continuation language  | Existential graph
Recursion                | Mathematical Induction

Một điều quan trọng nhưng vẫn chưa được nghiên cứu là mối quan hệ của 2 tiếp diễn (liên tục có 2 tham số) và Sheffer stroke . Trong logic cổ điển, Sheffer đột quỵ có thể tạo thành một hệ thống logic hoàn chỉnh tự nó (cộng với một số khái niệm không phải toán tử). Có nghĩa là quen thuộc and, or, notcó thể được thực hiện chỉ sử dụng stoke Sheffer hay nand.

Đây là một thực tế quan trọng về sự tương ứng kiểu lập trình của nó vì nó nhắc rằng một bộ tổ hợp kiểu duy nhất có thể được sử dụng để tạo thành tất cả các kiểu khác.

Chữ ký kiểu của tiếp nối 2 là (a,b) -> Void. Bằng cách triển khai này, chúng ta có thể định nghĩa 1-tiếp tục (liên tục bình thường) là (a,a)-> Void, product type as ((a,b)->Void,(a,b)->Void)->Void, sum type as ((a,a)->Void,(b,b)->Void)->Void. Điều này cho chúng ta một ấn tượng về sức mạnh biểu cảm của nó.

Nếu chúng ta tìm hiểu sâu hơn, chúng ta sẽ phát hiện ra rằng biểu đồ tồn tại của Piece tương đương với một ngôn ngữ có kiểu dữ liệu duy nhất là n-tiếp tục, nhưng tôi không thấy bất kỳ ngôn ngữ hiện có nào ở dạng này. Vì vậy, việc phát minh ra một thứ có thể rất thú vị, tôi nghĩ.

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.