Quelle PropLog.thy
Sprache: Isabelle
(* Title: ZF/Induct/PropLog.thy
Author: Tobias Nipkow & Lawrence C Paulson
Copyright 1993 University of Cambridge
*)
section ‹ Meta-theory of propositional logic›
theory PropLog imports ZF begin
text ‹
Datatype definition of propositional logic formulae and inductive
definition of the propositional tautologies.
Inductive definition of propositional logic. Soundness and
completeness w.r.t.\ truth-tables.
Prove: If ‹ H |= p› then ‹ G |= p› where ‹ G ∈
Fin(H) ›
›
subsection ‹ The datatype of propositions›
consts
propn :: i
datatype propn =
Fls
| Var ("n ∈ nat" ) (‹ #_› [100] 100)
| Imp ("p ∈ propn" , "q ∈ propn" ) (infixr ‹ ==> › 90)
subsection ‹ The proof system›
consts thms :: "i ==> i"
abbreviation
thms_syntax :: "[i,i] ==> o" (infixl ‹ |-› 50)
where "H |- p ≡ p ∈ thms(H)"
inductive
domains "thms(H)" ⊆ "propn"
intros
H: "[ p ∈ H; p ∈ propn] ==> H |- p"
K: "[ p ∈ propn; q ∈ propn] ==> H |- p==> q==> p"
S: "[ p ∈ propn; q ∈ propn; r ∈ propn]
==> H |- (p==> q==> r) ==> (p==> q) ==> p==> r"
DN: "p ∈ propn ==> H |- ((p==> Fls) ==> Fls) ==> p"
MP: "[ H |- p==> q; H |- p; p ∈ propn; q ∈ propn] ==> H |- q"
type_intros "propn.intros"
declare propn.intros [simp]
subsection ‹ The semantics›
subsubsection ‹ Semantics of propositional logic.›
consts
is_true_fun :: "[i,i] ==> i"
primrec
"is_true_fun(Fls, t) = 0"
"is_true_fun(Var(v), t) = (if v ∈ t then 1 else 0)"
"is_true_fun(p==> q, t) = (if is_true_fun(p,t) = 1 then is_true_fun(q,t) else 1)"
definition
is_true :: "[i,i] ==> o" where
"is_true(p,t) ≡ is_true_fun(p,t) = 1"
🍋 ‹ this definition is required since predicates can't be recursive›
lemma is_true_Fls [simp]: "is_true(Fls,t) ⟷ False"
by (simp add: is_true_def)
lemma is_true_Var [simp]: "is_true(#v,t) ⟷ v ∈ t"
by (simp add: is_true_def)
lemma is_true_Imp [simp]: "is_true(p==> q,t) ⟷ (is_true(p,t)⟶ is_true(q,t))"
by (simp add: is_true_def)
subsubsection ‹ Logical consequence›
text ‹
For every valuation, if all elements of ‹ H› are true then so
is ‹ p› .
›
definition
logcon :: "[i,i] ==> o" (infixl ‹ |=› 50) where
"H |= p ≡ ∀ t. (∀ q ∈ H. is_true(q,t)) ⟶ is_true(p,t)"
text ‹
A finite set of hypotheses from ‹ t› and the ‹ Var› s in
‹ p› .
›
consts
hyps :: "[i,i] ==> i"
primrec
"hyps(Fls, t) = 0"
"hyps(Var(v), t) = (if v ∈ t then {#v} else {#v==> Fls})"
"hyps(p==> q, t) = hyps(p,t) ∪ hyps(q,t)"
subsection ‹ Proof theory of propositional logic›
lemma thms_mono: "G ⊆ H ==> thms(G) ⊆ thms(H)"
unfolding thms.defs
apply (rule lfp_mono)
apply (rule thms.bnd_mono)+
apply (assumption | rule univ_mono basic_monos)+
done
lemmas thms_in_pl = thms.dom_subset [THEN subsetD]
inductive_cases ImpE: "p==> q ∈ propn"
lemma thms_MP: "[ H |- p==> q; H |- p] ==> H |- q"
🍋 ‹ Stronger Modus Ponens rule: no typechecking!›
apply (rule thms.MP)
apply (erule asm_rl thms_in_pl thms_in_pl [THEN ImpE])+
done
lemma thms_I: "p ∈ propn ==> H |- p==> p"
🍋 ‹ Rule is called ‹ I› for Identity Combinator, not for Introduction.›
apply (rule thms.S [THEN thms_MP, THEN thms_MP])
apply (rule_tac [5] thms.K)
apply (rule_tac [4] thms.K)
apply simp_all
done
subsubsection ‹ Weakening, left and right›
lemma weaken_left: "[ G ⊆ H; G|-p] ==> H|-p"
🍋 ‹ Order of premises is convenient with ‹ THEN› \›
by (erule thms_mono [THEN subsetD])
lemma weaken_left_cons: "H |- p ==> cons(a,H) |- p"
by (erule subset_consI [THEN weaken_left])
lemmas weaken_left_Un1 = Un_upper1 [THEN weaken_left]
lemmas weaken_left_Un2 = Un_upper2 [THEN weaken_left]
lemma weaken_right: "[ H |- q; p ∈ propn] ==> H |- p==> q"
by (simp_all add: thms.K [THEN thms_MP] thms_in_pl)
subsubsection ‹ The deduction theorem›
theorem deduction: "[ cons(p,H) |- q; p ∈ propn] ==> H |- p==> q"
apply (erule thms.induct)
apply (blast intro: thms_I thms.H [THEN weaken_right])
apply (blast intro: thms.K [THEN weaken_right])
apply (blast intro: thms.S [THEN weaken_right])
apply (blast intro: thms.DN [THEN weaken_right])
apply (blast intro: thms.S [THEN thms_MP [THEN thms_MP]])
done
subsubsection ‹ The cut rule›
lemma cut: "[ H|-p; cons(p,H) |- q] ==> H |- q"
apply (rule deduction [THEN thms_MP])
apply (simp_all add: thms_in_pl)
done
lemma thms_FlsE: "[ H |- Fls; p ∈ propn] ==> H |- p"
apply (rule thms.DN [THEN thms_MP])
apply (rule_tac [2] weaken_right)
apply (simp_all add: propn.intros )
done
lemma thms_notE: "[ H |- p==> Fls; H |- p; q ∈ propn] ==> H |- q"
by (erule thms_MP [THEN thms_FlsE])
subsubsection ‹ Soundness of the rules wrt truth-table semantics›
theorem soundness: "H |- p ==> H |= p"
unfolding logcon_def
apply (induct set: thms)
apply auto
done
subsection ‹ Completeness›
subsubsection ‹ Towards the completeness proof›
lemma Fls_Imp: "[ H |- p==> Fls; q ∈ propn] ==> H |- p==> q"
apply (frule thms_in_pl)
apply (rule deduction)
apply (rule weaken_left_cons [THEN thms_notE])
apply (blast intro: thms.H elim: ImpE)+
done
lemma Imp_Fls: "[ H |- p; H |- q==> Fls] ==> H |- (p==> q)==> Fls"
apply (frule thms_in_pl)
apply (frule thms_in_pl [of concl: "q==> Fls" ])
apply (rule deduction)
apply (erule weaken_left_cons [THEN thms_MP])
apply (rule consI1 [THEN thms.H, THEN thms_MP])
apply (blast intro: weaken_left_cons elim: ImpE)+
done
lemma hyps_thms_if:
"p ∈ propn ==> hyps(p,t) |- (if is_true(p,t) then p else p==> Fls)"
🍋 ‹ Typical example of strengthening the induction statement.›
apply simp
apply (induct_tac p)
apply (simp_all add: thms_I thms.H)
apply (safe elim!: Fls_Imp [THEN weaken_left_Un1] Fls_Imp [THEN weaken_left_Un2])
apply (blast intro: weaken_left_Un1 weaken_left_Un2 weaken_right Imp_Fls)+
done
lemma logcon_thms_p: "[ p ∈ propn; 0 |= p] ==> hyps(p,t) |- p"
🍋 ‹ Key lemma for completeness; yields a set of assumptions satisfying ‹ p› \›
apply (drule hyps_thms_if)
apply (simp add: logcon_def)
done
text ‹
For proving certain theorems in our new propositional logic.
›
lemmas propn_SIs = propn.intros deduction
and propn_Is = thms_in_pl thms.H thms.H [THEN thms_MP]
text ‹
The excluded middle in the form of an elimination rule.
›
lemma thms_excluded_middle:
"[ p ∈ propn; q ∈ propn] ==> H |- (p==> q) ==> ((p==> Fls)==> q) ==> q"
apply (rule deduction [THEN deduction])
apply (rule thms.DN [THEN thms_MP])
apply (best intro!: propn_SIs intro: propn_Is)+
done
lemma thms_excluded_middle_rule:
"[ cons(p,H) |- q; cons(p==> Fls,H) |- q; p ∈ propn] ==> H |- q"
🍋 ‹ Hard to prove directly because it requires cuts›
apply (rule thms_excluded_middle [THEN thms_MP, THEN thms_MP])
apply (blast intro!: propn_SIs intro: propn_Is)+
done
subsubsection ‹ Completeness -- lemmas for reducing the set of assumptions›
text ‹
For the case 🍋 ‹ hyps(p,t)-cons(#v,Y) |- p› we also have 🍋 ‹ hyps(p,t)-{#v} ⊆ hyps(p, t-{v}) › .
›
lemma hyps_Diff:
"p ∈ propn ==> hyps(p, t-{v}) ⊆ cons(#v==> Fls, hyps(p,t)-{#v})"
by (induct set: propn) auto
text ‹
For the case 🍋 ‹ hyps(p,t)-cons(#v ==> Fls,Y) |- p› we also have
🍋 ‹ hyps(p,t)-{#v==> Fls} ⊆ hyps(p, cons(v,t))› .
›
lemma hyps_cons:
"p ∈ propn ==> hyps(p, cons(v,t)) ⊆ cons(#v, hyps(p,t)-{#v==> Fls})"
by (induct set: propn) auto
text ‹ Two lemmas for use with ‹ weaken_left› \›
lemma cons_Diff_same: "B-C ⊆ cons(a, B-cons(a,C))"
by blast
lemma cons_Diff_subset2: "cons(a, B-{c}) - D ⊆ cons(a, B-cons(c,D))"
by blast
text ‹
The set 🍋 ‹ hyps(p,t)› is finite, and elements have the form
🍋 ‹ #v› or 🍋 ‹ #v==> Fls› ; could probably prove the stronger
🍋 ‹ hyps(p,t) ∈ Fin(hyps(p,0) ∪ hyps(p,nat))› .
›
lemma hyps_finite: "p ∈ propn ==> hyps(p,t) ∈ Fin(∪ v ∈ nat. {#v, #v==> Fls})"
by (induct set: propn) auto
lemmas Diff_weaken_left = Diff_mono [OF _ subset_refl, THEN weaken_left]
text ‹
Induction on the finite set of assumptions 🍋 ‹ hyps(p,t0)› . We
may repeatedly subtract assumptions until none are left!
›
lemma completeness_0_lemma [rule_format]:
"[ p ∈ propn; 0 |= p] ==> ∀ t. hyps(p,t) - hyps(p,t0) |- p"
apply (frule hyps_finite)
apply (erule Fin_induct)
apply (simp add: logcon_thms_p Diff_0)
txt ‹ inductive step›
apply safe
txt ‹ Case 🍋 ‹ hyps(p,t)-cons(#v,Y) |- p› \›
apply (rule thms_excluded_middle_rule)
apply (erule_tac [3] propn.intros )
apply (blast intro: cons_Diff_same [THEN weaken_left])
apply (blast intro: cons_Diff_subset2 [THEN weaken_left]
hyps_Diff [THEN Diff_weaken_left])
txt ‹ Case 🍋 ‹ hyps(p,t)-cons(#v ==> Fls,Y) |- p› \›
apply (rule thms_excluded_middle_rule)
apply (erule_tac [3] propn.intros )
apply (blast intro: cons_Diff_subset2 [THEN weaken_left]
hyps_cons [THEN Diff_weaken_left])
apply (blast intro: cons_Diff_same [THEN weaken_left])
done
subsubsection ‹ Completeness theorem›
lemma completeness_0: "[ p ∈ propn; 0 |= p] ==> 0 |- p"
🍋 ‹ The base case for completeness›
apply (rule Diff_cancel [THEN subst])
apply (blast intro: completeness_0_lemma)
done
lemma logcon_Imp: "[ cons(p,H) |= q] ==> H |= p==> q"
🍋 ‹ A semantic analogue of the Deduction Theorem›
by (simp add: logcon_def)
lemma completeness:
"H ∈ Fin(propn) ==> p ∈ propn ==> H |= p ==> H |- p"
apply (induct arbitrary: p set: Fin)
apply (safe intro!: completeness_0)
apply (rule weaken_left_cons [THEN thms_MP])
apply (blast intro!: logcon_Imp propn.intros )
apply (blast intro: propn_Is)
done
theorem thms_iff: "H ∈ Fin(propn) ==> H |- p ⟷ H |= p ∧ p ∈ propn"
by (blast intro: soundness completeness thms_in_pl)
end
Messung V0.5 in Prozent C=72 H=82 G=76
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-04-28)
¤
*© Formatika GbR, Deutschland
2026-05-26