อะไรคือความเท่าเทียมที่น่าสนใจที่สุดที่เกิดจาก Curry-Howard Isomorphism?


98

ฉันได้พบกับCurry-Howard Isomorphismในช่วงชีวิตการเขียนโปรแกรมของฉันค่อนข้างช้าและบางทีสิ่งนี้อาจทำให้ฉันรู้สึกทึ่งกับมันมาก มันหมายความว่าสำหรับทุกแนวคิดการเขียนโปรแกรมมีอะนาล็อกที่แม่นยำในตรรกะที่เป็นทางการและในทางกลับกัน นี่คือรายการ "พื้นฐาน" ของการเปรียบเทียบดังกล่าวที่อยู่เหนือหัวของฉัน:

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

ดังนั้นสำหรับคำถามของฉัน: อะไรคือผลกระทบที่น่าสนใจ / คลุมเครือของ isomorphism นี้? ฉันไม่ใช่นักตรรกวิทยาดังนั้นฉันแน่ใจว่าฉันได้ขีดข่วนพื้นผิวด้วยรายการนี้เท่านั้น

ตัวอย่างเช่นต่อไปนี้เป็นแนวคิดในการเขียนโปรแกรมที่ฉันไม่รู้ชื่อที่มีเหตุผลในตรรกะ:

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

และนี่คือแนวคิดเชิงตรรกะที่ฉันไม่ได้ตรึงไว้ในเงื่อนไขการเขียนโปรแกรม:

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

แก้ไข:

นี่คือความเท่าเทียมกันเพิ่มเติมที่รวบรวมจากคำตอบ:

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

Closed ~ = set of axioms
Apocalisp

+1 คำถามนี้และคำตอบและความคิดเห็นที่มีคุณภาพทั้งหมดสอนฉันเกี่ยวกับ CHI มากกว่าสิ่งที่ฉันสามารถเรียนรู้ผ่านอินเทอร์เน็ต
อเล็กซานเดรค.

25
@ พอลนาธาน:goto | jumping to conclusions
โจอี้อดัมส์

ฉันคิดว่าชุดโปรแกรมที่ถูกต้องทั้งหมดน่าจะเป็นแบบจำลอง
Daniil

1
fst / snd | การกำจัดร่วมซ้าย / ขวา | แนะนำการแยก
Tony Morris

คำตอบ:


34

เนื่องจากคุณถามสิ่งที่น่าสนใจและคลุมเครือที่สุดอย่างชัดเจน:

คุณสามารถขยาย CH ไปยังลอจิกที่น่าสนใจมากมายและสูตรของลอจิกเพื่อรับการติดต่อที่หลากหลายจริงๆ ที่นี่ฉันได้พยายามมุ่งเน้นไปที่สิ่งที่น่าสนใจมากกว่าที่จะคลุมเครือบวกกับพื้นฐานสองสามอย่างที่ยังไม่เกิดขึ้น

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:

"การสร้างคำพิพากษาของ Modal Logic" http://www.cs.cmu.edu/~fp/papers/mscs00.pdf - นี่เป็นจุดเริ่มต้นที่ดีเพราะเริ่มต้นจากหลักการแรกและส่วนใหญ่มีเป้าหมายเพื่อเป็น สามารถเข้าถึงได้โดยผู้ที่ไม่ใช่นักตรรกะ / นักทฤษฎีภาษา (ฉันเป็นผู้เขียนคนที่สองดังนั้นฉันจึงมีอคติ)


ขอบคุณที่ให้ตัวอย่างที่ไม่สำคัญ (นั่นคือจิตวิญญาณของคำถามเดิมจริงๆ) แม้ว่าฉันจะยอมรับว่ามีหลายคำถามอยู่เหนือหัว ... คำว่า "ความจำเป็น" และ "ความเป็นไปได้" ถูกกำหนดไว้อย่างแม่นยำในตรรกะหรือไม่? พวกเขาแปลเป็นเทียบเท่าการคำนวณได้อย่างไร
Tom Crockett

2
ฉันสามารถชี้ไปที่เอกสารที่ตีพิมพ์สำหรับแต่ละสิ่งเหล่านี้ได้ ตรรกะของโมดอลได้รับการศึกษาอย่างมาก (ตั้งแต่อริสโตเติล) และเกี่ยวข้องกับโหมดความจริงที่แตกต่างกัน - "A เป็นจริง" หมายถึง "ในทุกโลกที่เป็นไปได้ A เป็นจริง" ในขณะที่ "A เป็นจริง" หมายถึง "A เป็นจริงในโลกที่เป็นไปได้" . คุณสามารถพิสูจน์สิ่งต่างๆเช่น "(จำเป็น (A -> B) และอาจเป็น A) -> อาจเป็น B" กฎการอนุมานโมดอลให้ผลโดยตรงกับการสร้างนิพจน์การพิมพ์และกฎการลดตามปกติใน CH ดู: en.wikipedia.org/wiki/Modal_logicและcs.cmu.edu/~fp/papers/mscs00.pdf
RD1

2
@pelotom: คุณอาจต้องการที่จะอ่านเล็กน้อยเกี่ยวกับชนิดอื่น ๆ ของตรรกะ ตรรกะคลาสสิกธรรมดามักจะไม่มีประโยชน์ในบริบทนี้ - ฉันพูดถึงตรรกะเชิงสัญชาตญาณในคำตอบของฉัน แต่ตรรกะเชิงกิริยาและเชิงเส้นแม้จะ "แปลกกว่า" แต่ก็ยอดเยี่ยมจริงๆ
CA McCann

1
ขอบคุณสำหรับคำแนะนำดูเหมือนว่าฉันมีเรื่องต้องทำ!
Tom Crockett

2
@ RD1: คุณคิดว่ามันไม่ดีฉันใช้เวลาคิดมากใน Haskell ว่าฉันต้องแปลสูตรตรรกะเพรดิเคตทางจิตใจให้เป็นลายเซ็นประเภทก่อนที่จะสมเหตุสมผล :( ไม่ต้องพูดถึงว่ากฎหมายกลางที่ถูกกีดกันและการเริ่มต้นดังกล่าวดูสับสนและน่าสงสัยจริงๆ
CA McCann

26

คุณกำลังสับสนเล็กน้อยเกี่ยวกับการไม่เปลี่ยนแปลง Falsity แสดงด้วยประเภทที่ไม่มีใครอยู่ซึ่งตามความหมายแล้วไม่สามารถยุติการใช้งานได้เนื่องจากไม่มีสิ่งใดในการประเมินประเภทนั้นตั้งแต่แรก

การไม่ยุติแสดงถึงความขัดแย้ง -ตรรกะที่ไม่สอดคล้องกัน แน่นอนว่าตรรกะที่ไม่สอดคล้องกันจะช่วยให้คุณพิสูจน์ได้ อะไรก็ได้รวมถึงความเท็จด้วย

การเพิกเฉยต่อความไม่สอดคล้องกันโดยทั่วไประบบประเภทจะสอดคล้องกับตรรกะเชิงสัญชาตญาณและเป็นไปตามความจำเป็นคอนสตรัคติวิสต์ซึ่งหมายความว่าตรรกะคลาสสิกบางส่วนไม่สามารถแสดงออกได้โดยตรงหากเป็นเช่นนั้น ในทางกลับกันสิ่งนี้มีประโยชน์เพราะหากประเภทเป็นหลักฐานเชิงสร้างสรรค์ที่ถูกต้องคำประเภทนั้นเป็นวิธีการสร้างสิ่งที่คุณได้พิสูจน์แล้วว่ามีอยู่จริงวิธีการของการสร้างสิ่งที่คุณได้พิสูจน์การมีอยู่ของ

คุณลักษณะที่สำคัญของรสชาติคอนสตรัคติวิสต์คือการปฏิเสธสองครั้งไม่เทียบเท่ากับการไม่ปฏิเสธ ในความเป็นจริงการปฏิเสธจะไม่ค่อยดั้งเดิมในระบบการพิมพ์เพื่อแทนเราสามารถแสดงเป็นนัยว่าความเท็จเช่นกลายเป็นnot P P -> Falsityการปฏิเสธสองครั้งจะเป็นฟังก์ชันที่มีประเภท(P -> Falsity) -> FalsityPที่ชัดเจนจะไม่เทียบเท่ากับบางสิ่งบางอย่างเพียงชนิด

อย่างไรก็ตามมีสิ่งที่น่าสนใจเกี่ยวกับเรื่องนี้! ในภาษาที่มีพหุนามแบบพาราเมตริกตัวแปรประเภทจะอยู่ในประเภทที่เป็นไปได้ทั้งหมดรวมถึงตัวแปรที่ไม่มีใครอยู่ดังนั้นประเภทของความหลากหลายอย่างสมบูรณ์เช่น∀a. aในบางแง่ก็เกือบเป็นเท็จ แล้วถ้าเราเขียนเกือบลบสองเท่าโดยใช้ความหลากหลาย? เราได้ประเภทที่มีลักษณะดังนี้: ∀a. (P -> a) -> a. เทียบเท่ากับสิ่งที่เป็นประเภทPหรือไม่? แน่นอนมันเป็นเพียงการนำไปใช้กับฟังก์ชัน identity เท่านั้น

แต่ประเด็นคืออะไร? ทำไมต้องเขียนประเภทเช่นนั้น? มันหมายถึงอะไรในแง่การเขียนโปรแกรม? คุณสามารถคิดว่ามันเป็นฟังก์ชันที่มีบางสิ่งบางอย่างPอยู่แล้วและต้องการให้คุณกำหนดฟังก์ชันที่ใช้Pเป็นอาร์กิวเมนต์โดยที่สิ่งทั้งหมดเป็นความหลากหลายในประเภทผลลัพธ์สุดท้าย ในแง่หนึ่งมันแสดงถึงการคำนวณที่ถูกระงับรอให้ส่วนที่เหลือได้รับการจัดเตรียม ในแง่นี้การคำนวณที่ถูกระงับเหล่านี้สามารถประกอบเข้าด้วยกันส่งต่อเรียกใช้อะไรก็ได้ สิ่งนี้น่าจะฟังดูคุ้นเคยสำหรับแฟน ๆ บางภาษาเช่น Scheme หรือ Ruby เพราะความหมายก็คือการลบล้างสองครั้งสอดคล้องกับรูปแบบการส่งต่อและในความเป็นจริงประเภทที่ฉันให้ไว้ข้างต้นเป็น monad ต่อเนื่องใน Haskell


ขอบคุณสำหรับการแก้ไขฉันได้ลบ "ความเท็จ" เป็นคำพ้องความหมายของการไม่เปลี่ยนแปลง +1 สำหรับการลบสองครั้ง <=> CPS!
Tom Crockett

P -> Falsityฉันไม่ได้ค่อนข้างได้รับสัญชาติญาณที่อยู่เบื้องหลังที่เป็นตัวแทนของ¬pเป็น ฉันเข้าใจว่าทำไมมันถึงใช้งานได้ (¬p≡ p →⊥) แต่ฉันไม่ได้รับเวอร์ชันโค้ด P -> ⊥ควรจะอาศัยอยู่อย่างแม่นยำเมื่อPไม่ใช่หรือไม่? แต่ไม่ควรมีฟังก์ชั่นนี้อยู่เสมอใช่หรือไม่? หรือเป็นไปได้ไม่จริงเนื่องจากคุณไม่สามารถคืนค่าอินสแตนซ์ของ? ฉันไม่ค่อยเห็นสภาพของมัน สัญชาตญาณที่นี่คืออะไร?
Antal Spector-Zabusky

1
@Antal SZ: สัญชาตญาณคือตรรกะสัญชาตญาณแน่นอน! แต่ใช่ว่าการเขียนฟังก์ชันดังกล่าวเป็นเรื่องยาก ฉันเห็นในโปรไฟล์ของคุณว่าคุณรู้จัก Haskell ดังนั้นคุณอาจกำลังคิดเกี่ยวกับประเภทข้อมูลพีชคณิตและการจับคู่รูปแบบ? พิจารณาว่าประเภทที่ไม่มีใครอยู่จะต้องไม่มีตัวสร้างดังนั้นจึงไม่มีรูปแบบที่ตรงกับ คุณต้องเขียน "ฟังก์ชัน" โดยไม่มีเนื้อความซึ่งไม่ถูกกฎหมาย Haskell ตามความรู้ของฉันไม่มีวิธีใดที่จะเขียนคำว่า Negated type ใน Haskell โดยไม่ใช้ข้อยกเว้นรันไทม์หรือการไม่ยกเลิก
CA McCann

1
@ Antal SZ: ในทางกลับกันถ้าตรรกะที่เท่ากันมีความสอดคล้องกันฟังก์ชันทั้งหมดจะต้องมีทั้งหมดเช่นการจับคู่รูปแบบทั้งหมดจะต้องครบถ้วนสมบูรณ์ ดังนั้นในการเขียนฟังก์ชันโดยไม่มีรูปแบบประเภทพารามิเตอร์จะต้องไม่มีตัวสร้างเช่นไม่มีใครอยู่ ดังนั้นฟังก์ชั่นดังกล่าวจะถูกกฎหมาย - และเป็นประเภทของตัวเองที่อาศัยอยู่ - อย่างแม่นยำและเฉพาะเมื่ออาร์กิวเมนต์ไม่มีใครอยู่ ดังนั้นฟังก์ชันP -> Falsityจึงเทียบเท่ากับPเท็จ
CA McCann

Aha ฉันคิดว่าฉันเข้าใจแล้ว เวอร์ชันที่ฉันเคยให้ความบันเทิงเป็นสิ่งที่คล้ายf x = xกันซึ่งจะเป็น iff ทันทีP = ⊥แต่เห็นได้ชัดว่ายังไม่เป็นที่แพร่หลายมากพอ ดังนั้นแนวคิดก็คือการที่จะคืนของที่ไร้ค่าคุณไม่จำเป็นต้องมีร่างกาย แต่เพื่อให้ฟังก์ชั่นนั้นสามารถกำหนดได้และทั้งหมดคุณไม่จำเป็นต้องมีกรณีใดและหากPไม่มีใครอยู่ทุกอย่างก็ใช้ได้? นั่นเป็นเพียงเล็กน้อย แต่ฉันคิดว่าฉันเห็นแล้ว ดูเหมือนว่าจะโต้ตอบค่อนข้างแปลกกับคำจำกัดความของXorประเภทของฉัน ... ฉันจะต้องคิดเกี่ยวกับเรื่องนั้น ขอบคุณ!
Antal Spector-Zabusky

15

แผนภูมิของคุณไม่ถูกต้อง ในหลาย ๆ กรณีคุณมีประเภทที่สับสนกับคำศัพท์

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] ตรรกะสำหรับภาษาที่ใช้งานทัวริงสมบูรณ์ไม่สอดคล้องกัน การเรียกซ้ำไม่มีความสอดคล้องกันในทฤษฎีที่สอดคล้องกัน ในตรรกะที่ไม่สอดคล้องกัน / ทฤษฎีการพิสูจน์ที่ไม่น่าเชื่อถือคุณสามารถเรียกมันว่ากฎที่ทำให้เกิดความไม่สอดคล้องกัน / ไม่ลงตัว

[2] อีกครั้งนี่เป็นผลมาจากความสมบูรณ์ นี่จะเป็นข้อพิสูจน์ของการต่อต้านทฤษฎีบทหากตรรกะสอดคล้องกัน - ดังนั้นจึงไม่สามารถดำรงอยู่ได้

[3] ไม่มีอยู่ในภาษาที่ใช้งานได้เนื่องจากมีคุณสมบัติทางตรรกะลำดับที่หนึ่ง: การหาปริมาณและพารามิเตอร์ทั้งหมดจะทำผ่านสูตร หากคุณมีคุณสมบัติลำดับแรกจะมีชนิดอื่นที่ไม่ใช่*, * -> *ฯลฯ .; ชนิดขององค์ประกอบของโดเมนของวาทกรรม ยกตัวอย่างเช่นในFather(X,Y) :- Parent(X,Y), Male(X), XและYช่วงกว่าโดเมนของวาทกรรม (เรียกว่าDom) Male :: Dom -> *และ


[1] - ใช่ฉันควรเจาะจงมากกว่านี้ ฉันหมายถึง "การเรียกซ้ำตามโครงสร้าง" มากกว่าการเรียกซ้ำแบบไม่มีข้อ จำกัด ซึ่งฉันเดาว่าเหมือนกับ "พับ" [3] - มีอยู่ในภาษาที่พิมพ์ขึ้น
Tom Crockett

[1] ความจริงก็คือถ้าการเรียกใช้ฟังก์ชันการเรียกซ้ำ (modus ponens) ไม่ทำให้โปรแกรมไม่ยุติพารามิเตอร์ (สมมติฐาน) ที่ให้กับการเรียกหรือสภาพแวดล้อมจะต้องแตกต่างกันระหว่างการเรียกเหล่านั้น ดังนั้นการเรียกซ้ำเป็นเพียงการใช้ทฤษฎีบทเดียวกันหลาย ๆ ครั้ง ถ้ามีอะไรพิเศษก็มักจะเพิ่ม / ลดตัวเลข (ขั้นอุปนัย) และตรวจสอบกับกรณีที่มีอยู่ (กรณีฐาน) ซึ่งสอดคล้องกับ - การเหนี่ยวนำทางคณิตศาสตร์ในตรรกะ
Earth Engine

ฉันชอบแผนภูมินี้มาก แต่ฉันจะไม่พูดว่า "n / a" เนื่องจากตรรกะที่สอดคล้องกันไม่ใช่ตรรกะแบบเดียวเช่นเดียวกับการยุติโปรแกรมไม่ใช่โปรแกรมประเภทเดียว ฟังก์ชันที่ไม่ยุติจะสอดคล้องกับ "อาร์กิวเมนต์แบบวงกลม" และเป็นภาพประกอบที่ยอดเยี่ยมของไอโซมอร์ฟิซึมของ Curry-Howard: "ตาม" อาร์กิวเมนต์แบบวงกลมทำให้คุณวนซ้ำไม่รู้จบ
Joey Adams


13

ฉันชอบคำถามนี้มาก ฉันไม่รู้อะไรมากมาย แต่ฉันมีบางสิ่ง (ได้รับความช่วยเหลือจากบทความ Wikipediaซึ่งมีตารางที่เป็นระเบียบและตัวมันเอง):

  1. ผมคิดว่าผลรวมประเภท / ชนิดสหภาพ ( เช่น data Either a b = Left a | Right b ) เทียบเท่ากับรวมร้าวฉาน และแม้ว่าฉันจะไม่ค่อยคุ้นเคยกับ Curry-Howard แต่ฉันคิดว่านี่แสดงให้เห็น พิจารณาฟังก์ชันต่อไปนี้:

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

    ถ้าฉันเข้าใจสิ่งต่าง ๆ อย่างถูกต้องประเภทจะบอกว่า ( a  ∧  b ) → ( a  ★  b ) และคำจำกัดความก็บอกว่านี่เป็นความจริงโดยที่★เป็นแบบรวมหรือแบบเอกสิทธิ์เฉพาะบุคคลหรือแล้วแต่อย่างใดEitherอย่างหนึ่ง คุณได้Eitherเป็นตัวแทนเฉพาะหรือ, ⊕; อย่างไรก็ตาม ( a  ∧  b ) ↛ ( a  ⊕  b ) ตัวอย่างเช่น⊤∧⊤≡⊤ แต่⊤⊕⊥≡⊥และ⊤↛⊥ กล่าวอีกนัยหนึ่งถ้าทั้งaและbเป็นจริงสมมติฐานนั้นก็เป็นจริง แต่ข้อสรุปเป็นเท็จดังนั้นนัยนี้จึงต้องเป็นเท็จ อย่างไรก็ตามเห็นได้ชัดว่า ( a  ∧  b ) → ( a  ∨ b) เนื่องจากถ้าทั้งaและbเป็นจริงอย่างน้อยก็เป็นจริง ดังนั้นหากสหภาพแรงงานที่เลือกปฏิบัติเป็นรูปแบบหนึ่งของการแตกแยกพวกเขาจะต้องเป็นความหลากหลายที่ครอบคลุม ฉันคิดว่าสิ่งนี้ถือเป็นข้อพิสูจน์ แต่อย่าลังเลที่จะปฏิเสธความคิดนี้ของฉัน

  2. ในทำนองเดียวกันคำจำกัดความของคุณสำหรับ tautology และความไร้สาระในฐานะฟังก์ชัน identity และฟังก์ชัน non-terminating ตามลำดับจะไม่ค่อยดีนัก สูตรที่แท้จริงแสดงโดยประเภทหน่วยซึ่งเป็นประเภทที่มีองค์ประกอบเดียวเท่านั้น ( data ⊤ = ⊤มักสะกด()และ / หรือUnitในภาษาโปรแกรมที่ใช้งานได้) สิ่งนี้สมเหตุสมผล: เนื่องจากคนประเภทนั้นได้รับการรับรองว่ามีผู้อาศัยอยู่และเนื่องจากมีผู้อยู่อาศัยเพียงคนเดียวที่เป็นไปได้จึงต้องเป็นจริง ฟังก์ชั่นระบุตัวตนเป็นเพียงตัวแทนของ tautology เฉพาะที่a  →  a .

    ความคิดเห็นของคุณเกี่ยวกับฟังก์ชันที่ไม่ยุตินั้นขึ้นอยู่กับสิ่งที่คุณหมายถึงอย่างชัดเจนยิ่งขึ้น Curry-Howard ทำงานบนระบบ type แต่ไม่มีการเข้ารหัสที่ไม่มีการสิ้นสุด ตามวิกิพีเดียการจัดการกับการไม่ยุติเป็นปัญหาเนื่องจากการเพิ่มเข้าไปทำให้เกิดตรรกะที่ไม่สอดคล้องกัน ( เช่นฉันสามารถกำหนดwrong :: a -> bโดยwrong x = wrong xและทำให้ "พิสูจน์" ว่าa  →  bสำหรับaและbใด ๆ) หากนี่คือสิ่งที่คุณหมายถึงโดย“ ความไร้สาระ” แสดงว่าคุณพูดถูกแล้ว หากคุณหมายถึงข้อความเท็จแทนสิ่งที่คุณต้องการคือประเภทที่ไม่มีใครอยู่เช่นสิ่งที่กำหนดโดยdata ⊥นั่นคือชนิดข้อมูลที่ไม่มีวิธีการสร้าง สิ่งนี้ทำให้มั่นใจได้ว่าไม่มีค่าใด ๆ เลยดังนั้นจึงต้องไม่มีใครอยู่ซึ่งเทียบเท่ากับเท็จ ฉันคิดว่าคุณอาจใช้งานได้a -> bเช่นกันเนื่องจากถ้าเราห้ามไม่ให้มีการยกเลิกฟังก์ชันนี้ก็จะไม่มีใครอยู่ด้วย แต่ฉันไม่แน่ใจ 100%

  3. Wikipediaกล่าวว่าสัจพจน์ถูกเข้ารหัสในสองวิธีที่แตกต่างกันขึ้นอยู่กับว่าคุณตีความ Curry-Howard อย่างไร: ในตัวผสมหรือในตัวแปร ฉันคิดว่ามุมมอง Combinator หมายความว่าฟังก์ชันดั้งเดิมที่เราได้รับเข้ารหัสสิ่งที่เราสามารถพูดได้ตามค่าเริ่มต้น (คล้ายกับวิธีที่ modus ponens เป็นสัจพจน์เนื่องจากแอปพลิเคชันฟังก์ชันเป็นแบบดั้งเดิม) และฉันคิดว่ามุมมองตัวแปรอาจหมายถึงสิ่งเดียวกันจริง ๆ - ตัวรวมกันเป็นเพียงตัวแปรส่วนกลางซึ่งเป็นฟังก์ชันเฉพาะ สำหรับประเภทดึกดำบรรพ์: ถ้าฉันคิดเกี่ยวกับสิ่งนี้อย่างถูกต้องฉันคิดว่าประเภทดั้งเดิมคือเอนทิตี - วัตถุดั้งเดิมที่เรากำลังพยายามพิสูจน์สิ่งต่างๆ

  4. ตามคลาสตรรกะและความหมายของฉันความจริงที่ว่า ( a  ∧  b ) →  c  ≡  a  → ( b  →  c ) (และb  → ( a  →  c )) เรียกว่ากฎการเทียบเท่าการส่งออกอย่างน้อยก็ในการหักตามธรรมชาติ บทพิสูจน์. ตอนนั้นฉันไม่ได้สังเกตว่ามันเป็นแค่แกง - ฉันหวังว่าจะได้เพราะมันเจ๋งมาก!

  5. ในขณะที่ตอนนี้เรามีวิธีที่จะเป็นตัวแทนของการรวมร้าวฉานเราไม่ได้มีวิธีที่จะเป็นตัวแทนของความหลากหลายพิเศษ เราควรจะสามารถใช้นิยามของการแยกเฉพาะเพื่อแทนค่าได้: a  ⊕  b  ≡ ( a  ∨  b ) ∧¬ ( a  ∧  b ) ฉันไม่รู้ว่าจะเขียนการปฏิเสธอย่างไร แต่ฉันรู้ว่า¬ p  ≡  p  → and และทั้งความหมายและความเท็จนั้นง่ายมาก ดังนั้นเราจึงสามารถแสดงการแยกส่วนเฉพาะโดย:

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

    สิ่งนี้กำหนดให้เป็นประเภทว่างที่ไม่มีค่าซึ่งสอดคล้องกับความเท็จ Xorถูกกำหนดไว้แล้วจะมีทั้งสองอย่าง ( และ ) หรือ ( หรือ ) และฟังก์ชั่น ( หมาย ) จาก(A, B) ( และ ) ประเภทด้านล่าง ( เท็จ ) อย่างไรก็ตามฉันไม่รู้ว่านี่หมายถึงอะไร ( แก้ไข 1:ตอนนี้ฉันทำแล้วดูย่อหน้าถัดไป!) เนื่องจากไม่มีค่าประเภทEither(a,b) -> ⊥ (มีหรือไม่) ฉันไม่สามารถเข้าใจได้ว่าสิ่งนี้จะหมายถึงอะไรในโปรแกรม มีใครรู้วิธีที่ดีกว่าในการคิดเกี่ยวกับคำจำกัดความนี้หรืออีกแง่หนึ่ง? ( แก้ไข 1:ใช่camccann )

    แก้ไข 1:ขอบคุณคำตอบของ camccann (โดยเฉพาะอย่างยิ่งความคิดเห็นที่เขาทิ้งไว้เพื่อช่วยฉัน) ฉันคิดว่าฉันเห็นว่าเกิดอะไรขึ้นที่นี่ ในการสร้างมูลค่าของประเภทXor a bคุณต้องระบุสองสิ่ง ประการแรกเป็นพยานถึงการมีอยู่ขององค์ประกอบของข้อโต้แย้งอย่างใดอย่างหนึ่งaหรือbเป็นข้อโต้แย้งแรก นั่นคือ a Left aหรือRight b. และประการที่สองข้อพิสูจน์ว่าไม่มีองค์ประกอบของทั้งสองประเภทaและb- กล่าวอีกนัยหนึ่ง(a,b)คือข้อพิสูจน์ที่ไม่มีใครอยู่ - เป็นข้อโต้แย้งที่สอง เนื่องจากคุณจะสามารถเขียนฟังก์ชันได้เฉพาะใน(a,b) -> ⊥กรณีที่(a,b)ไม่มีใครอยู่เท่านั้นหมายความว่าอย่างไร? นั่นหมายความว่าบางส่วนของวัตถุประเภท(a,b)ไม่สามารถสร้างได้ กล่าวอีกนัยหนึ่งก็คืออย่างน้อยหนึ่งคนและอาจเป็นไปได้ทั้งสองอย่างaและbไม่มีใครอยู่ด้วย! ในกรณีนี้ถ้าเรากำลังคิดเกี่ยวกับการจับคู่รูปแบบคุณอาจไม่สามารถจับคู่รูปแบบกับทูเปิลดังกล่าวได้: สมมติว่าbไม่มีใครอยู่เราจะเขียนอะไรที่ตรงกับส่วนที่สองของทูเปิลนั้นได้ ดังนั้นเราจึงไม่สามารถจับคู่รูปแบบได้ซึ่งอาจช่วยให้คุณเห็นว่าเหตุใดจึงทำให้ไม่มีใครอยู่ ตอนนี้วิธีเดียวที่จะมีฟังก์ชันทั้งหมดที่ไม่มีอาร์กิวเมนต์ (เนื่องจากสิ่งนี้ต้องมีเนื่องจาก(a,b)ไม่มีใครอยู่) ก็คือผลลัพธ์ที่ได้ก็คือประเภทที่ไม่มีใครอยู่ด้วยเช่นกันหากเรากำลังคิดเกี่ยวกับสิ่งนี้จากมุมมองการจับคู่รูปแบบ ซึ่งหมายความว่าแม้ว่าฟังก์ชันจะไม่มีกรณีใด ๆ แต่ก็ไม่มีเนื้อความที่เป็นไปได้ มันอาจมีอย่างใดอย่างหนึ่งและทุกอย่างก็โอเค

หลายสิ่งหลายอย่างนี้คือฉันกำลังคิดดัง ๆ / พิสูจน์ (หวังว่า) สิ่งต่างๆได้ทันที แต่ฉันหวังว่ามันจะมีประโยชน์ ผมขอแนะนำให้บทความวิกิพีเดีย ; ฉันไม่ได้อ่านในรายละเอียดใด ๆ แต่ตารางของมันเป็นบทสรุปที่ดีจริงๆและมันก็ละเอียดมาก


1
+1 เพื่อชี้ให้เห็นว่าทั้งสองอย่างรวมหรือ. โปรดสังเกตว่า (aa) เป็นทฤษฎีบท (สำหรับ a ทั้งหมด)
Apocalisp

คำถามอีกครั้ง 2 (b): อะไรคือความแตกต่างระหว่างประเภทฟังก์ชันที่มีผู้อยู่อาศัยเพียงคนเดียวเท่านั้นที่ไม่ยุติและประเภทฟังก์ชันที่ไม่มีใครอยู่? ตัวอย่างเช่นถ้าฉันประกาศประเภท B โดยไม่มีตัวสร้างจากนั้นกำหนดฟังก์ชัน A-> B เช่นนั้น: fun (a: A): B: = f (a) สิ่งนี้จะพิมพ์ตรวจสอบในหลายภาษาแม้ว่าจะเป็น เป็นไปไม่ได้ที่จะคืนค่า B ดังนั้นฟังก์ชันจึง "อาศัย" ในแง่หนึ่ง แต่ "ผู้อยู่อาศัย" ของมันนั้นไร้สาระ ... ดังนั้นจึงไม่มีใครอาศัยอยู่เลยจริงๆ หวังว่านี่จะสมเหตุสมผลนะ :)
Tom Crockett

3
ท่อนล่างไม่ใช่ข้อพิสูจน์ “ เป็นเรื่องไร้สาระและเป็นไปไม่ได้ที่จะคิดว่าสิ่งที่ไม่รู้และไม่แน่นอนควรมีและกำหนด” - Aristoteles
Apocalisp

2
@ Tom: เพียงแค่จะขับรถกลับบ้านจุดเกี่ยวกับการเลิกจ้างที่ไม่-ที่ถ้าตรรกะสอดคล้องโปรแกรมทั้งหมดยุติ การไม่ยุติเกิดขึ้นเฉพาะในระบบประเภทที่แสดงถึงลอจิกที่ไม่สอดคล้องกันหรือระบบประเภทเดียวกันสำหรับภาษาทัวริงที่สมบูรณ์
CA McCann

1
Apocalisp: Either a aไม่ควรเป็นทฤษฎีบท:Either ⊥ ⊥ยังไม่มีใครอยู่ ทอม: ดังที่ camccann กล่าวความสอดคล้องหมายถึงการยุติ ดังนั้นระบบประเภทที่สอดคล้องกันจะไม่อนุญาตให้คุณแสดงออกf :: a -> bดังนั้นประเภทจะไม่มีใครอยู่ ระบบประเภทที่ไม่สอดคล้องกันจะมีผู้อยู่อาศัยสำหรับประเภทนั้น แต่ระบบที่ไม่สามารถยุติได้ camccann:มีระบบประเภทที่ไม่สอดคล้องกันซึ่งไม่สมบูรณ์แบบทัวริงซึ่งครอบครองจุดที่อยู่ระหว่างจุดบนลำดับชั้นหรือไม่? หรือขั้นตอนสุดท้ายนั้น (เพิ่มการเรียกซ้ำทั่วไปหรืออะไรก็ตาม) เทียบเท่ากับความไม่สอดคล้องกันอย่างแม่นยำ?
Antal Spector-Zabusky

12

นี่เป็นสิ่งที่คลุมเครือเล็กน้อยที่ฉันประหลาดใจที่ไม่ได้พูดถึงก่อนหน้านี้: การเขียนโปรแกรมปฏิกิริยาเชิงฟังก์ชัน "คลาสสิก" สอดคล้องกับตรรกะชั่วคราว

แน่นอนว่าหากคุณไม่ได้เป็นนักปรัชญานักคณิตศาสตร์หรือนักเขียนโปรแกรมที่ใช้งานได้อย่างหมกมุ่นสิ่งนี้อาจทำให้เกิดคำถามขึ้นอีกมากมาย

ดังนั้นก่อนอื่น: การเขียนโปรแกรมปฏิกิริยาเชิงฟังก์ชันคืออะไร? เป็นวิธีที่เปิดเผยในการทำงานด้วยค่าที่แปรผันตามเวลา สิ่งนี้มีประโยชน์สำหรับการเขียนสิ่งต่างๆเช่นอินเทอร์เฟซผู้ใช้เนื่องจากอินพุตจากผู้ใช้เป็นค่าที่แตกต่างกันไปตามช่วงเวลา FRP "คลาสสิก" มีข้อมูลพื้นฐาน 2 ประเภท ได้แก่ เหตุการณ์และพฤติกรรม

เหตุการณ์แสดงถึงค่าที่มีอยู่ในช่วงเวลาที่ไม่ต่อเนื่อง การกดแป้นพิมพ์เป็นตัวอย่างที่ดี: คุณสามารถคิดว่าอินพุตจากแป้นพิมพ์เป็นอักขระในช่วงเวลาที่กำหนด จากนั้นการกดแป้นแต่ละครั้งจะเป็นเพียงคู่กับอักขระของแป้นและเวลาที่กด

พฤติกรรมเป็นค่านิยมที่มีอยู่ตลอดเวลา แต่สามารถเปลี่ยนแปลงได้อย่างต่อเนื่อง ตำแหน่งเมาส์เป็นตัวอย่างที่ดี: มันเป็นเพียงพฤติกรรมของพิกัด x, y ท้ายที่สุดแล้วเมาส์จะมีตำแหน่งเสมอและในแนวความคิดตำแหน่งนี้จะเปลี่ยนไปเรื่อย ๆเมื่อคุณเลื่อนเมาส์ ท้ายที่สุดแล้วการเลื่อนเมาส์เป็นการกระทำที่ยืดเยื้อเพียงครั้งเดียวไม่ใช่ขั้นตอนที่ไม่ต่อเนื่อง

และตรรกะทางโลกคืออะไร? อย่างเหมาะสมก็คือชุดของกฎเชิงตรรกะสำหรับจัดการกับข้อเสนอที่มีปริมาณตามช่วงเวลา โดยพื้นฐานแล้วมันจะขยายตรรกะลำดับที่หนึ่งตามปกติด้วยตัวบ่งชี้สองตัว: □และ◇ คำแรกแปลว่า "always": อ่านว่า□φว่า "φ always hold" อย่างที่สองคือ "ในที่สุด": ◇φหมายความว่า "φจะยึด" ในที่สุด นี้เป็นชนิดหนึ่งของคำกริยาตรรกศาสตร์ กฎหมายสองฉบับต่อไปนี้เกี่ยวข้องกับตัวระบุปริมาณ:

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

ดังนั้น□และ◇จึงเป็นคู่ซึ่งกันและกันในลักษณะเดียวกับ∀และ∃

ตัวบ่งชี้ทั้งสองนี้สอดคล้องกับสองประเภทใน FRP โดยเฉพาะ□สอดคล้องกับพฤติกรรมและ◇สอดคล้องกับเหตุการณ์ หากเราคิดว่าประเภทเหล่านี้อาศัยอยู่ได้อย่างไรสิ่งนี้น่าจะสมเหตุสมผล: พฤติกรรมจะอาศัยอยู่ในทุกเวลาที่เป็นไปได้ในขณะที่เหตุการณ์เกิดขึ้นเพียงครั้งเดียว


8

ที่เกี่ยวข้องกับความสัมพันธ์ระหว่างการต่อเนื่องและการปฏิเสธสองครั้งประเภทของการโทร / cc คือกฎของ Peirce http://en.wikipedia.org/wiki/Call-with-current-continuation

CH มักจะระบุว่าเป็นความสัมพันธ์ระหว่างตรรกะและโปรแกรมสัญชาตญาณ อย่างไรก็ตามหากเราเพิ่มตัวดำเนินการ call-with-current-Continuation (callCC) (ซึ่งประเภทนี้สอดคล้องกับกฎของ Peirce) เราจะได้รับความสอดคล้องระหว่างตรรกะแบบคลาสสิกและโปรแกรมกับ callCC


4

แม้ว่าจะไม่ใช่ไอโซมอร์ฟิซึมแบบธรรมดา แต่การอภิปรายเรื่อง LEM เชิงสร้างสรรค์นี้เป็นผลลัพธ์ที่น่าสนใจมาก โดยเฉพาะอย่างยิ่งในส่วนบทสรุป Oleg Kelyov กล่าวถึงวิธีการใช้ monads เพื่อกำจัดการปฏิเสธสองครั้งในตรรกะเชิงสร้างสรรค์นั้นคล้ายคลึงกับการแยกแยะความแตกต่างของข้อเสนอที่สามารถตัดสินใจได้ในเชิงคำนวณ (ซึ่ง LEM ถูกต้องในการตั้งค่าเชิงสร้างสรรค์) จากข้อเสนอทั้งหมด ความคิดที่ว่า monads จับเอฟเฟกต์การคำนวณเป็นเรื่องเก่า แต่ตัวอย่างของ Curry - Howard isomorphism ช่วยให้มองเห็นมุมมองและช่วยให้เข้าใจถึงสิ่งที่ "หมายถึง" ที่แท้จริงของการปฏิเสธสองครั้ง


4

การสนับสนุนความต่อเนื่องชั้นหนึ่งช่วยให้คุณแสดง $ P \ lor \ neg P $ เคล็ดลับนี้ขึ้นอยู่กับข้อเท็จจริงที่ว่าการไม่เรียกการต่อเนื่องและการออกด้วยนิพจน์บางอย่างจะเทียบเท่ากับการเรียกความต่อเนื่องด้วยนิพจน์เดียวกันนั้น

ดูรายละเอียดเพิ่มเติมได้ที่: http://www.cs.cmu.edu/~rwh/courses/logic/www-old/handouts/callcc.pdf


ขอบคุณสำหรับข้อมูลเชิงลึก!
paulotorrens

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

สิ่งหนึ่งที่เป็นสิ่งสำคัญ แต่ยังไม่ได้รับการตรวจสอบความสัมพันธ์ของ 2 ต่อเนื่อง (ตที่ใช้เวลา 2 พารามิเตอร์) และSheffer โรคหลอดเลือดสมอง ในตรรกะคลาสสิก Sheffer stroke สามารถสร้างระบบลอจิกที่สมบูรณ์ได้ด้วยตัวมันเอง ซึ่งหมายความว่าคุ้นเคยand, or, notสามารถดำเนินการได้โดยใช้เพียงจี้ Sheffer nandหรือ

นี่เป็นข้อเท็จจริงที่สำคัญของการรองรับประเภทการเขียนโปรแกรมเนื่องจากแจ้งว่าสามารถใช้ตัวผสมชนิดเดียวเพื่อสร้างประเภทอื่น ๆ ได้ทั้งหมด

ลายเซ็นประเภทของ 2 (a,b) -> Voidต่อเนื่องคือ โดยการใช้งานนี้เราสามารถกำหนด 1-continuous (ความต่อเนื่องปกติ) เป็น(a,a)-> Void, product type as ((a,b)->Void,(a,b)->Void)->Void, sum type as((a,a)->Void,(b,b)->Void)->Voidประเภทผลรวมเป็นสิ่งนี้ทำให้เราเห็นถึงพลังแห่งการแสดงออกที่น่าประทับใจ

หากเราเจาะลึกลงไปเราจะพบว่ากราฟอัตถิภาวนิยมของ Piece นั้นเทียบเท่ากับภาษาที่มีข้อมูลประเภทเดียวคือ n-ต่อเนื่อง แต่ฉันไม่เห็นภาษาที่มีอยู่ในรูปแบบนี้ ฉันคิดว่าการประดิษฐ์สิ่งที่น่าสนใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.