Harvard School of Engineering and Applied Sciences CS 152: Programming Languages

Similar documents
Logical Preliminaries

Type Systems. Lecture 9: Classical Logic. Neel Krishnaswami University of Cambridge

CS Lecture 19: Logic To Truth through Proof. Prof. Clarkson Fall Today s music: Theme from Sherlock

Lecture Notes on The Curry-Howard Isomorphism

The Curry-Howard Isomorphism

Implementing Proof Systems for the Intuitionistic Propositional Logic

Propositional Logic Arguments (5A) Young W. Lim 11/8/16

a. ~p : if p is T, then ~p is F, and vice versa

Announcements. CS243: Discrete Structures. Propositional Logic II. Review. Operator Precedence. Operator Precedence, cont. Operator Precedence Example

Learning Goals of CS245 Logic and Computation

3.2 Reduction 29. Truth. The constructor just forms the unit element,. Since there is no destructor, there is no reduction rule.

Lecture 2. Logic Compound Statements Conditional Statements Valid & Invalid Arguments Digital Logic Circuits. Reading (Epp s textbook)

Propositional Logics and their Algebraic Equivalents

AI Principles, Semester 2, Week 2, Lecture 5 Propositional Logic and Predicate Logic

Logic for Computer Science - Week 4 Natural Deduction

Introduction to Intuitionistic Logic

Lecture 11: Measuring the Complexity of Proofs

Propositions as Types

Language of Propositional Logic

Lecture Notes on Combinatory Modal Logic

AN ALTERNATIVE NATURAL DEDUCTION FOR THE INTUITIONISTIC PROPOSITIONAL LOGIC

Propositions and Proofs

Overview. I Review of natural deduction. I Soundness and completeness. I Semantics of propositional formulas. I Soundness proof. I Completeness proof.

CHAPTER 11. Introduction to Intuitionistic Logic

Computation and Logic Definitions

15414/614 Optional Lecture 1: Propositional Logic

Lecture Notes on Classical Linear Logic

Natural Deduction for Propositional Logic

Categories, Proofs and Programs

Propositional Logic Arguments (5A) Young W. Lim 10/11/16

Topic 1: Propositional logic

Henk Barendregt and Freek Wiedijk assisted by Andrew Polonsky. Radboud University Nijmegen. March 5, 2012

Mat 243 Exam 1 Review

Description Logics. Foundations of Propositional Logic. franconi. Enrico Franconi

Logic for Computer Science - Week 5 Natural Deduction

2. The Logic of Compound Statements Summary. Aaron Tan August 2017

Chapter 11: Automated Proof Systems (1)

CS 6110 Lecture 28 Subtype Polymorphism 3 April 2013 Lecturer: Andrew Myers

COMP219: Artificial Intelligence. Lecture 19: Logic for KR

Chapter Summary. Propositional Logic. Predicate Logic. Proofs. The Language of Propositions (1.1) Applications (1.2) Logical Equivalences (1.

COMP219: Artificial Intelligence. Lecture 19: Logic for KR

Propositional Logic: Part II - Syntax & Proofs 0-0

PHIL12A Section answers, 16 February 2011

A call-by-name lambda-calculus machine

Logic Part II: Intuitionistic Logic and Natural Deduction

Simply Typed λ-calculus

Natural Deduction. Formal Methods in Verification of Computer Systems Jeremy Johnson

Propositional Logic Arguments (5A) Young W. Lim 11/30/16

Logic: Propositional Logic (Part I)

CMSC 336: Type Systems for Programming Languages Lecture 10: Polymorphism Acar & Ahmed 19 February 2008

Propositional and Predicate Logic. jean/gbooks/logic.html

CS1021. Why logic? Logic about inference or argument. Start from assumptions or axioms. Make deductions according to rules of reasoning.

Natural deduction for truth-functional logic

What is Logic? Introduction to Logic. Simple Statements. Which one is statement?

Induction on Failing Derivations

Propositional Logic Arguments (5A) Young W. Lim 11/29/16

Announcements. CS311H: Discrete Mathematics. Propositional Logic II. Inverse of an Implication. Converse of a Implication

Semantics and Pragmatics of NLP

Structuring Logic with Sequent Calculus

A Short Introduction to Hoare Logic

Advanced Topics in LP and FP

Propositional natural deduction

Propositions and Proofs

MACM 101 Discrete Mathematics I. Exercises on Propositional Logic. Due: Tuesday, September 29th (at the beginning of the class)

Propositional Logic: Review

Symbolic Logic 3. For an inference to be deductively valid it is impossible for the conclusion to be false if the premises are true.

Lecture Notes on Linear Logic

THE LOGIC OF COMPOUND STATEMENTS

Propositional logic (revision) & semantic entailment. p. 1/34

Fundamentals of Logic

Propositional Logic. Jason Filippou UMCP. ason Filippou UMCP) Propositional Logic / 38

PL: Truth Trees. Handout Truth Trees: The Setup

Constructive approach to relevant and affine term calculi

Chapter 11: Automated Proof Systems

n logical not (negation) n logical or (disjunction) n logical and (conjunction) n logical exclusive or n logical implication (conditional)

Overview. Knowledge-Based Agents. Introduction. COMP219: Artificial Intelligence. Lecture 19: Logic for KR

Stratifications and complexity in linear logic. Daniel Murfet

Chapter 1, Part I: Propositional Logic. With Question/Answer Animations

Lecture Notes on Quantification

The Logic of Compound Statements cont.

Introduction Logic Inference. Discrete Mathematics Andrei Bulatov

Today s Lecture 2/25/10. Truth Tables Continued Introduction to Proofs (the implicational rules of inference)

Logic, Sets, and Proofs

Teaching Natural Deduction as a Subversive Activity

A PROOF SYSTEM FOR SEPARATION LOGIC WITH MAGIC WAND

cis32-ai lecture # 18 mon-3-apr-2006

Chapter 1, Logic and Proofs (3) 1.6. Rules of Inference

7. Propositional Logic. Wolfram Burgard and Bernhard Nebel

Deduction by Daniel Bonevac. Chapter 3 Truth Trees

Stanford University CS103: Math for Computer Science Handout LN9 Luca Trevisan April 25, 2014

ECE473 Lecture 15: Propositional Logic

Propositional Calculus: Formula Simplification, Essential Laws, Normal Forms

Homework 5: Parallelism and Control Flow : Types and Programming Languages Fall 2015 TA: Evan Cavallo

Knowledge representation DATA INFORMATION KNOWLEDGE WISDOM. Figure Relation ship between data, information knowledge and wisdom.

Proof Rules for Correctness Triples

Consequence Relations and Natural Deduction

Prefixed Tableaus and Nested Sequents

Review of Propositional Calculus

Hoare Logic: Reasoning About Imperative Programs

Lecture Notes on Cut Elimination

Transcription:

Harvard School of Engineering and Applied Sciences CS 152: Programming Languages Lecture 17 Tuesday, April 2, 2013 1 There is a strong connection between types in programming languages and propositions in intuitionistic logic. This correspondence was noticed by Haskell Curry and William Howard. It is known as the Curry- Howard isomorphism, and also as the propositions-as-types correspondence, and proofs-as-programs correspondence. Intuitionistic logic equates the truth of formula with their provability. That is, for a statement φ to be true, there must be a proof of φ. The key difference between intuitionistic logic and classical logic is that in intuitionistic logic, the rule of excluded middle does not apply: it is not a tautology that either φ or φ. The inference rules and axioms for typing programs are very similar to the inference rules and axioms for proving formulas in intuitionistic logic. That is, types are like formulas, and programs are like proofs. Conjunction = Product types For example, suppose we have an expression e 1 with type τ 1, and expression e 2 with type τ 2. Think of e 1 as a proof of some logical formulas τ 1, and e 2 as a proof of some logical formulas τ 2. What would constitute a proof of the formulas τ 1 τ 2? We would need a proof of τ 1 and a proof of τ 2. Say we put these proofs together in a pair: (e 1, e 2 ). This is a program with type τ 1 τ 2. That is, the product type τ 1 τ 2 corresponds to conjunction! Disjunction = Sum types Similarly, how do we prove τ 1 τ 2? Under intuitionistic logic, we need either a proof of τ 1, or a proof of τ 2. Thinking about programs and types, this means we need either an expression of type τ 1 or an expression of type τ 2. We have a construct that meets this description: the sum type τ 1 + τ 2 corresponds to disjunction! Implication = Function types What does the function type τ 1 τ 2 correspond to? We can think of a function of type τ 1 τ 2 as taking an expression of type τ 1 and producing something of type τ 2, which by the Curry-Howard isomorphism, means taking a proof of proposition τ 1 and producing a proof of proposition τ 2. This corresponds to implication: if τ 1 is true, then τ 2 is true. Universal quantification = Parametric polymorphism The polymorphic lambda calculus introduced universal quantification over types: X. τ. As the notation suggests, this corresponds to universal quantification in intuitionistic logic. To prove formula X. τ, we would need a way to prove τ{τ /X} for all propositions τ. This is what the expression ΛX. e gives us: for any type τ, the type of the expression (ΛX. e) [τ ] is τ{τ /X}, where τ is the type of e. Invalidity = uninhabited type So under the Curry-Howard isomorphism, expression e of type τ is a proof of proposition τ. If we have a proposition τ that is not true, then there is no proof for τ, i.e., there is no expression e of type τ. A type that has no expressions with that type is called an uninhabited type. There are many uninhabited types, such as X. X. Uninhabited types correspond to false formulas. Inhabited types are theorems. 1.1 Examples Consider the formula φ 1, φ 2, φ 3. ((φ 1 φ 2 ) (φ 2 φ 3 )) (φ 1 φ 3 ).

The type corresponding to this formula is X, Y, Z. ((X Y ) (Y Z)) (X Z). This formula is a tautology. So there is a proof of the formula. By the Curry-Howard isomorphism, there should be an expression with the type X, Y, Z. ((X Y ) (Y Z)) (X Z). Indeed, the following is an expression with the appropriate type. ΛX, Y, Z. λf :(X Y ) (Y Z). λx:x. (#2 f) ((#1 f) x) We saw earlier in the course that we can curry a function. That is, given a function of type (τ 1 τ 2 ) τ 3, we can give a function of type τ 1 τ 2 τ 3. We can do this with a function. That is, the expression has type λf :(τ 1 τ 2 ) τ 3. λx:τ 1. λy :τ 2. f (x, y) ((τ 1 τ 2 ) τ 3 ) (τ 1 τ 2 τ 3 ). The corresponding logical formula is (φ 1 φ 2 φ 3 ) (φ 1 (φ 2 φ 3 )), which is a tautology. 1.2 Negation and continuations In intuitionistic logic, if τ is true, then τ is false, meaning there is no proof of τ.we can think of τ as being equivalent to τ False, or, as the type τ, where is some uninhabited type such as X. X. That is, if τ is true, then if you give me a proof of τ, I can give you a proof of False. We have seen functions that take an argument, and never produce a result: continuations. Continuations can be thought of as corresponding to negation. Suppose that we have a special type Answer that is the return type of continuations. That is, a continuation that takes an argument of type τ has the type τ Answer. Assume further that we have no values of type Answer, i.e., Answer is an uninhabited type. A continuation-passing style translation of an expression e of type τ, CPS [e], has the form λk :τ Answer...., where k is a continuation, and the translation will evaluate e, and give the result to k. Thus, the type of CPS [e] is (τ Answer) Answer. Under the Curry-Howard isomorphism, this type corresponds to (τ False) False, or, equivalently, ( τ), the double negation of τ, which is equivalent to τ. CPS translation converts an expression of type τ to an expression of type (τ Answer) Answer, which is equivalent to τ! 2 Insights for PL from Logic, and Vice-Versa The Curry-Howard isomorphism gives a connection between logic and types. This connection goes both ways: we can use insights from logic to think about programming languages, and develop new language features that correspond to logical entities; and we can use insights from programming languages influence our study and use of logic? We consider two examples: how substructural logics give rise to substructural type systems, and how type theory can help us prove theorems. 2.1 Substructural Type Systems 2.1.1 Natural deduction and structural inference rules Natural deduction is a kind of proof calculus that can be used to formalize mathematical logic. It s called natural deduction because it is meant to correspond to a natural way of reasoning about truth. In natural deduction, we write A 1,..., A n B Page 2 of 5

to mean that whenever formulas A 1 through A n are true, then formula B is true. For example, in a propositional calculus, we may write the judgment p, q q p, which intuitively means that if proposition p is true, and formula q is true, then the formula q p is true. Like we do in programming languages, we can write inference rules and axioms for a given natural deduction calculus, that define which judgments are true. For example, we may have an axiom φ, ψ φ ψ That is, if formulas φ and ψ are true, then the conjunction φ ψ is true. The inference rules that are concerned with the manipulation of the assumptions (i.e., the formulas on the left of the turnstile ) are known as the structural inference rules. The structural inference rules allow us to treat the assumptions like a set. That is, there are inference rules to re-order the assumptions, to collapse identical assumptions, and to remove unneeded assumptions. We use Γ and to range over (possibly empty) sequences of formulas. EXCHANGE Γ, A, B, C Γ, B, A, C CONTRACTION Γ, A, A, B Γ, A, B WEAKENING Γ, B Γ, A, B There are, of course, other inference rules, depending on the logic. Here are some of the inference rules for a propositional logic. Note that the assumptions in the conclusion of the inference rules are conserved in the premises, e.g., there is no duplication or dropping of assumptions. A A Γ, B A Γ B A Γ B A Γ, A B Γ A B Γ, A B Γ A B Γ A Γ A B Γ B If we drop any of the structural inference rules from the definition of our logic, we have a substructural logic. For example, if we allow Exchange but drop Weakening and Contraction we have a linear logic: every assumption must be used exactly once. If we allow both Exchange and Weakening, but drop Contraction, we have an affine logic: every assumption may be used at most once. 2.1.2 Substructural type systems So, what new programming language features or designs do substructural logic give us? You may have noticed the similarity between the natural deduction judgments for logic and the type judgments we use in programming languages. A type judgment looks like Γ e:τ where we can think of the type context Γ as being a sequence x 1 : τ 1,..., x n : τ n. Inference rules for such a type system would need to have rules for manipulating the type context. EXCHANGE Γ, x:τ 1, y :τ 2, e:τ Γ, y :τ 2, x:τ 1, e:τ WEAKENING Γ, e:τ Γ, x:τ, e:τ CONTRACTION x not in Γ, Γ, x:τ, x:τ, e:τ Γ, x:τ, e:τ If we drop any of these structural inference rules, we have a substructural type system. Page 3 of 5

Linear type systems So if we drop Contraction and Weakening, we have a linear type system, by analogy with a linear logic. So how does dropping Contraction and Weakening affect the set of programs that will be well typed? Well, variables placed into the typing context must be used exactly once along any control flow path. The rule Contraction would allow us to use a variable multiple times, and Weakening allows us to not use a variable at all. This makes linear type systems good for tracking the use of resources. For example, we can use a linear type system to track open file handles, and ensure that a client must always close a file (i.e., must use the file handle at least once), and cannot close a file multiple times (i.e., must use the file handle at most once). In a similar way, we can use a linear type system to track objects allocated on the heap, and (with some additional language support) ensure that we have always exactly one pointer to a heap object. This can be useful for reasoning about aliasing: if we maintain an invariant that each heap object has exactly one pointer, then if a function is given two pointers, it knows they must not alias. To use linear type systems in practice, it is often necessary to allow both linear types, and non-linear types (i.e., variables that can contraction and weakening applied to them), and/or to allow linearity to be weakened locally. Ordered type systems Think about a type system where we drop all three structural rules (Exchange, Contraction, and Weakening). This is known as an ordered type system. Every variable is used exactly once, in the order it was introduced. In the same way that we can use a linear type system to help us reason about heap-allocated memory, we can use an ordered type system to help us reason about stack-allocated memory: not only must we use (i.e., deallocate) every piece of memory exactly once, but we must do so in stack order: i.e., the most recently allocated memory on the stack must be deallocated first. 2.2 Theorem Proving The Curry-Howard isomorphism tells us that types correspond to formulas, or propositions, and that programs correspond to proofs. So, by this analogy, when we have a proof of a theorem, we have a program. What does it mean to run this program? That is, what is the executable content of a proof? Well, let s consider the following tautology in a propositional logic, where p, q, and r are propositions. The following is a derivation of this tautology. (p (q r)) (p q) r p (q r) p (q r) p (q r), p q q r p q p q p q p p (q r), p q, p q r p (q r), p q r p (q r) (p q) r p q p q p q q (p (q r)) (p q) r (Note the use of Contraction to duplicate the assumption p q.) Now, let s use the Curry-Howard isomorphism, and think about what a program would look like that had the type (τ 1 (τ 2 τ 3 )) (τ 1 τ 2 ) τ 3 which corresponds to the tautological formula. Here we present the proof that such a program is welltyped. There are a few things to note. First, the structure of the proof of well typedness has exactly the same structure as the proof of the formula. We have highlighted the terms in blue, leaving the types in black. If we think about constructing the terms from the leaves of the proof down towards the root, note that term construction is mechanical, based on which inference rule is applied. Page 4 of 5

a:τ 1 τ 2 a:τ 1 τ 2 f :τ 1 (τ 2 τ 3 ) f :τ 1 (τ 2 τ 3 ) a:τ 1 τ 2 #1 a:τ 1 a:τ 1 τ 2 a:τ 1 τ 2 f :τ 1 (τ 2 τ 3 ), a:τ 1 τ 2 f (#1 a):τ 2 τ 3 a:τ 1 τ 2 #2 a:τ 2 f :τ 1 (τ 2 τ 3 ), a:τ 1 τ 2, a:τ 1 τ 2 f (#1 a) (#2 a):τ 3 f :τ 1 (τ 2 τ 3 ), a:τ 1 τ 2 f (#1 a) (#2 a):τ 3 f :τ 1 (τ 2 τ 3 ) λa:τ 1 τ 2. f (#1 a) (#2 a) :(τ 1 τ 2 ) τ 3 λf :(τ 1 (τ 2 τ 3 )). λa:τ 1 τ 2. f (#1 a) (#2 a):(τ 1 (τ 2 τ 3 )) (τ 1 τ 2 ) τ 3 Now, what is this program? λf :(τ 1 (τ 2 τ 3 )). λa:τ 1 τ 2. f (#1 a) (#2 a) This is the uncurry function! It takes in a function of type τ 1 (τ 2 τ 3 ) and uncurrys the arguments, producing a function of type (τ 1 τ 2 ) τ 3. We got this program in a mechanical way, given the proof of the formula (p (q r)) (p q) r. More generally, if the logic is set up correctly, it is possible to extract executable content from proofs of many theorems. For example, a proof of the pigeon-hole principal can provide an algorithm to find a pigeon hole with at least two elements. More impressively, the executable content of a proof that it is possible for a distributed system to reach an agreement is a protocol for achieving agreement. Page 5 of 5