clasohm@1268: (* Title: FOL/IFOL.thy lcp@35: ID: $Id$ wenzelm@79: Author: Lawrence C Paulson, Cambridge University Computer Laboratory lcp@35: Copyright 1993 University of Cambridge lcp@35: lcp@35: Intuitionistic first-order logic lcp@35: *) lcp@35: wenzelm@79: IFOL = Pure + clasohm@0: wenzelm@79: classes wenzelm@79: term < logic wenzelm@79: wenzelm@79: default wenzelm@79: term clasohm@0: wenzelm@79: types clasohm@278: o clasohm@0: wenzelm@79: arities wenzelm@79: o :: logic clasohm@0: wenzelm@79: wenzelm@79: consts clasohm@0: wenzelm@79: Trueprop :: "o => prop" ("(_)" 5) wenzelm@79: True, False :: "o" wenzelm@79: wenzelm@79: (* Connectives *) wenzelm@79: wenzelm@79: "=" :: "['a, 'a] => o" (infixl 50) lcp@35: wenzelm@79: Not :: "o => o" ("~ _" [40] 40) wenzelm@79: "&" :: "[o, o] => o" (infixr 35) wenzelm@79: "|" :: "[o, o] => o" (infixr 30) wenzelm@79: "-->" :: "[o, o] => o" (infixr 25) wenzelm@79: "<->" :: "[o, o] => o" (infixr 25) wenzelm@79: wenzelm@79: (* Quantifiers *) wenzelm@79: wenzelm@79: All :: "('a => o) => o" (binder "ALL " 10) wenzelm@79: Ex :: "('a => o) => o" (binder "EX " 10) wenzelm@79: Ex1 :: "('a => o) => o" (binder "EX! " 10) wenzelm@79: clasohm@0: lcp@928: syntax lcp@928: "~=" :: "['a, 'a] => o" (infixl 50) lcp@928: lcp@35: translations wenzelm@79: "x ~= y" == "~ (x = y)" wenzelm@79: lcp@35: clasohm@0: rules clasohm@0: wenzelm@79: (* Equality *) clasohm@0: wenzelm@79: refl "a=a" wenzelm@79: subst "[| a=b; P(a) |] ==> P(b)" clasohm@0: wenzelm@79: (* Propositional logic *) clasohm@0: wenzelm@79: conjI "[| P; Q |] ==> P&Q" wenzelm@79: conjunct1 "P&Q ==> P" wenzelm@79: conjunct2 "P&Q ==> Q" clasohm@0: wenzelm@79: disjI1 "P ==> P|Q" wenzelm@79: disjI2 "Q ==> P|Q" wenzelm@79: disjE "[| P|Q; P ==> R; Q ==> R |] ==> R" clasohm@0: wenzelm@79: impI "(P ==> Q) ==> P-->Q" wenzelm@79: mp "[| P-->Q; P |] ==> Q" clasohm@0: wenzelm@79: FalseE "False ==> P" clasohm@0: wenzelm@79: (* Definitions *) clasohm@0: wenzelm@79: True_def "True == False-->False" wenzelm@79: not_def "~P == P-->False" wenzelm@79: iff_def "P<->Q == (P-->Q) & (Q-->P)" wenzelm@79: wenzelm@79: (* Unique existence *) clasohm@0: wenzelm@79: ex1_def "EX! x. P(x) == EX x. P(x) & (ALL y. P(y) --> y=x)" clasohm@0: wenzelm@79: (* Quantifiers *) clasohm@0: wenzelm@79: allI "(!!x. P(x)) ==> (ALL x.P(x))" wenzelm@79: spec "(ALL x.P(x)) ==> P(x)" clasohm@0: wenzelm@79: exI "P(x) ==> (EX x.P(x))" wenzelm@79: exE "[| EX x.P(x); !!x. P(x) ==> R |] ==> R" clasohm@0: clasohm@0: (* Reflection *) clasohm@0: wenzelm@79: eq_reflection "(x=y) ==> (x==y)" wenzelm@79: iff_reflection "(P<->Q) ==> (P==Q)" clasohm@0: clasohm@0: end wenzelm@79: