Inductive Predicates Unit vs True Inductive unit : Set := tt : unit Inductive True : Prop := I : True Curry Howard Isomorphism But Coq distinguish Proof and Program Efficiency? Proof Prevalence?
Propositional Logic not = fun A : Prop => A -> False : Prop -> Prop Inductive and (A : Prop) (B : Prop) : Prop := conj : A -> B -> A /\ B Inductive or (A : Prop) (B : Prop) : Prop := or_introl : A -> A \/ B | or_intror : B -> A \/ B
Bool Vs Prop bool is datatype of two members, true, false Prop is primitive type in Coq, and True, False are two members in Prop Coq use Constructive Logic, while P\/~P is not allowed Issues bool is decidable Constructive logic allow us to extract program from proof We can write program by proof a theorem, though maybe less efficient
First-Order Logic forall and exists forall is built-in exists: Inductive ex (A : Type) (P : A -> Prop) : Prop := ex_intro : forall x : A, P x -> ex P
Tactics Tauto Solve intuition logic, only unfold not Intuition Use tauto, and apply tactics Intuition=intuition auto. Firstorder Extend tauto to firstorder logic Trivial Restricted auto auto Eauto Auto using eapply, generate ‘_’
Basic dependant type Inductive isZero : nat -> Prop := | IsZero : isZero 0. Inductive even : nat -> Prop := | EvenO : even O | EvenSS : forall n, even n -> even (S (S n)). Example of product: forall a:A,B (s,s’,s’’) 约束分类 (s,s’,s’)s,s’ {Set,Prop} 普通的类型 (Type,Prop,Prop) (s,Type,Type)Type denpends on a value (Type,Type,Type)High order type