古典論理
Require Import boolean. Require Import logic. From Stdlib Require Logic.Classical_Prop. From Stdlib Require Import Logic.Description. From Stdlib Require Import Logic.PropExtensionality. From Stdlib Require Import Logic.FunctionalExtensionality.
排中律:
Abbreviation excluded_middle := Classical_Prop.classic.
2重否定除去:
P: Prop~ ~ P -> PP: Prop~ ~ P -> PP: Prop
H: ~ ~ PPP: Prop
H: ~ ~ P
H0: PPP: Prop
H: ~ ~ P
H0: ~ PPassumption.P: Prop
H: ~ ~ P
H0: PPcontradiction. Qed.P: Prop
H: ~ ~ P
H0: ~ PP
2重否定除去より、どんな命題もその2重否定と同一視できるようになる。
P: Prop(~ ~ P) = PP: Prop(~ ~ P) = PP: Prop~ ~ P <-> PP: Prop~ ~ P -> PP: PropP -> ~ ~ Papply double_negation_elimination.P: Prop~ ~ P -> Papply double_negation_introduction. Qed.P: PropP -> ~ ~ P
P, Q: Prop~ (P /\ Q) -> ~ P \/ ~ QP, Q: Prop~ (P /\ Q) -> ~ P \/ ~ QP, Q: Prop
H: ~ (P /\ Q)~ P \/ ~ QP, Q: Prop
H: P /\ Q -> False~ P \/ ~ QP, Q: Prop
H: P /\ Q -> False
H0: ~ P~ P \/ ~ QP, Q: Prop
H: P /\ Q -> False
H0: ~ ~ P~ P \/ ~ QP, Q: Prop
H: P /\ Q -> False
H0: ~ P~ P \/ ~ Qassumption.P, Q: Prop
H: P /\ Q -> False
H0: ~ P~ PP, Q: Prop
H: P /\ Q -> False
H0: ~ ~ P~ P \/ ~ QP, Q: Prop
H: P /\ Q -> False
H0: ~ ~ P~ QP, Q: Prop
H: P /\ Q -> False
H0: ~ ~ P
H1: QFalseP, Q: Prop
H: P /\ Q -> False
H0: ~ ~ P
H1: QP /\ Qexact (conj H0 H1). Qed.P, Q: Prop
H: P /\ Q -> False
H0: P
H1: QP /\ QP, Q: Prop(~ Q -> ~ P) -> P -> QP, Q: Prop(~ Q -> ~ P) -> P -> QP, Q: Prop
H: ~ Q -> ~ P
H0: PQP, Q: Prop
H: ~ Q -> ~ P
H0: P
H1: QQP, Q: Prop
H: ~ Q -> ~ P
H0: P
H1: ~ QQassumption.P, Q: Prop
H: ~ Q -> ~ P
H0: P
H1: QQP, Q: Prop
H: ~ Q -> ~ P
H0: P
H1: ~ QQcontradiction. Qed.P, Q: Prop
H: ~ P
H0: P
H1: ~ QQA: Type
P: A -> Prop~ (forall x : A, P x) -> exists x : A, ~ P xA: Type
P: A -> Prop~ (forall x : A, P x) -> exists x : A, ~ P xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)exists x : A, ~ P xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)~ ~ exists x : A, ~ P xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)
H0: ~ exists x : A, ~ P xFalseA: Type
P: A -> Prop
H: ~ (forall x : A, P x)
H0: ~ exists x : A, ~ P xforall x : A, P xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)
H0: ~ exists x : A, ~ P x
x: AP xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)
H0: ~ exists x : A, ~ P x
x: A
H1: P xP xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)
H0: ~ exists x : A, ~ P x
x: A
H1: ~ P xP xassumption.A: Type
P: A -> Prop
H: ~ (forall x : A, P x)
H0: ~ exists x : A, ~ P x
x: A
H1: P xP xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)
H0: ~ exists x : A, ~ P x
x: A
H1: ~ P xP xA: Type
P: A -> Prop
H: ~ (forall x : A, P x)
x: A
H1: ~ P xexists x0 : A, ~ P x0assumption. Qed.A: Type
P: A -> Prop
H: ~ (forall x : A, P x)
x: A
H1: ~ P x~ P x
A 上の述語 P は、「ある x : A に対して成り立つ」、あるいは「すべての x : A について成り立たない」。
A: Type
P: A -> Prop(exists x : A, P x) \/ (forall x : A, ~ P x)A: Type
P: A -> Prop(exists x : A, P x) \/ (forall x : A, ~ P x)A: Type
P: A -> Prop
H: exists x : A, P x(exists x : A, P x) \/ (forall x : A, ~ P x)A: Type
P: A -> Prop
H: ~ exists x : A, P x(exists x : A, P x) \/ (forall x : A, ~ P x)A: Type
P: A -> Prop
H: exists x : A, P x(exists x : A, P x) \/ (forall x : A, ~ P x)assumption.A: Type
P: A -> Prop
H: exists x : A, P xexists x : A, P xA: Type
P: A -> Prop
H: ~ exists x : A, P x(exists x : A, P x) \/ (forall x : A, ~ P x)A: Type
P: A -> Prop
H: ~ exists x : A, P xforall x : A, ~ P xassumption. Qed.A: Type
P: A -> Prop
H: ~ exists x : A, P x~ exists x : A, P x
P: Propexists ! b : bool, (P -> b = true) /\ (~ P -> b = false)P: Propexists ! b : bool, (P -> b = true) /\ (~ P -> b = false)P: Propexists x : bool, (P -> x = true) /\ (~ P -> x = false)P: Propuniqueness (fun x : bool => (P -> x = true) /\ (~ P -> x = false))
存在を排中律によって示す。
P: Propexists x : bool, (P -> x = true) /\ (~ P -> x = false)P: Prop
H: Pexists x : bool, (P -> x = true) /\ (~ P -> x = false)P: Prop
H: ~ Pexists x : bool, (P -> x = true) /\ (~ P -> x = false)P: Prop
H: Pexists x : bool, (P -> x = true) /\ (~ P -> x = false)P: Prop
H: P(P -> true = true) /\ (~ P -> true = false)P: Prop
H: PP -> true = trueP: Prop
H: P~ P -> true = falseP: Prop
H: PP -> true = truereflexivity.P: Prop
H, H0: Ptrue = truecontradiction.P: Prop
H: P~ P -> true = falseP: Prop
H: ~ Pexists x : bool, (P -> x = true) /\ (~ P -> x = false)P: Prop
H: ~ P(P -> false = true) /\ (~ P -> false = false)P: Prop
H: ~ PP -> false = trueP: Prop
H: ~ P~ P -> false = falsecontradiction.P: Prop
H: ~ PP -> false = trueP: Prop
H: ~ P~ P -> false = falsereflexivity.P: Prop
H, H0: ~ Pfalse = false
一意性も排中律によって示す。
P: Propuniqueness (fun x : bool => (P -> x = true) /\ (~ P -> x = false))P: Propforall x y : bool, (P -> x = true) /\ (~ P -> x = false) -> (P -> y = true) /\ (~ P -> y = false) -> x = yP: Prop
x, y: bool
H: (P -> x = true) /\ (~ P -> x = false)
H0: (P -> y = true) /\ (~ P -> y = false)x = yP: Prop
x, y: bool
H: P -> x = true
H1: ~ P -> x = false
H0: P -> y = true
H2: ~ P -> y = falsex = yP: Prop
x, y: bool
H: P -> x = true
H1: ~ P -> x = false
H0: P -> y = true
H2: ~ P -> y = false
H3: Px = yP: Prop
x, y: bool
H: P -> x = true
H1: ~ P -> x = false
H0: P -> y = true
H2: ~ P -> y = false
H3: ~ Px = yP: Prop
x, y: bool
H: P -> x = true
H1: ~ P -> x = false
H0: P -> y = true
H2: ~ P -> y = false
H3: Px = yP: Prop
x, y: bool
H: x = true
H1: ~ P -> x = false
H0: P -> y = true
H2: ~ P -> y = false
H3: Px = yP: Prop
x, y: bool
H: x = true
H1: ~ P -> x = false
H0: y = true
H2: ~ P -> y = false
H3: Px = yreflexivity.P: Prop
H1, H2: ~ P -> true = false
H3: Ptrue = trueP: Prop
x, y: bool
H: P -> x = true
H1: ~ P -> x = false
H0: P -> y = true
H2: ~ P -> y = false
H3: ~ Px = yP: Prop
x, y: bool
H: P -> x = true
H1: x = false
H0: P -> y = true
H2: ~ P -> y = false
H3: ~ Px = yP: Prop
x, y: bool
H: P -> x = true
H1: x = false
H0: P -> y = true
H2: y = false
H3: ~ Px = yreflexivity. Qed.P: Prop
H, H0: P -> false = true
H3: ~ Pfalse = falseP: PropboolP: Propboolexact (proj1_sig s). Defined.P: Prop
s:= constructive_definite_description (fun b : bool => (P -> b = true) /\ (~ P -> b = false)) (bool_by_cases P): {x : bool | (fun b : bool => (P -> b = true) /\ (~ P -> b = false)) x}boolP: Prop(P -> prop_to_bool P = true) /\ (~ P -> prop_to_bool P = false)P: Prop(P -> prop_to_bool P = true) /\ (~ P -> prop_to_bool P = false)exact (proj2_sig s). Qed.P: Prop
s:= constructive_definite_description (fun b : bool => (P -> b = true) /\ (~ P -> b = false)) (bool_by_cases P): {x : bool | (fun b : bool => (P -> b = true) /\ (~ P -> b = false)) x}(P -> prop_to_bool P = true) /\ (~ P -> prop_to_bool P = false)P: Propbool_to_prop (prop_to_bool P) = PP: Propbool_to_prop (prop_to_bool P) = PP: Prop
H: (P -> prop_to_bool P = true) /\ (~ P -> prop_to_bool P = false)bool_to_prop (prop_to_bool P) = PP: Prop
H: P -> prop_to_bool P = true
H0: ~ P -> prop_to_bool P = falsebool_to_prop (prop_to_bool P) = PP: Prop
H: P -> prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: Pbool_to_prop (prop_to_bool P) = PP: Prop
H: P -> prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: ~ Pbool_to_prop (prop_to_bool P) = PP: Prop
H: P -> prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: Pbool_to_prop (prop_to_bool P) = PP: Prop
H: prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: Pbool_to_prop (prop_to_bool P) = PP: Prop
H: prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: Pbool_to_prop true = PP: Prop
H: prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: PTrue = PP: Prop
H: prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: PP = Trueassumption.P: Prop
H: prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: PPP: Prop
H: P -> prop_to_bool P = true
H0: ~ P -> prop_to_bool P = false
H1: ~ Pbool_to_prop (prop_to_bool P) = PP: Prop
H: P -> prop_to_bool P = true
H0: prop_to_bool P = false
H1: ~ Pbool_to_prop (prop_to_bool P) = PP: Prop
H: P -> prop_to_bool P = true
H0: prop_to_bool P = false
H1: ~ Pbool_to_prop false = PP: Prop
H: P -> prop_to_bool P = true
H0: prop_to_bool P = false
H1: ~ PFalse = PP: Prop
H: P -> prop_to_bool P = true
H0: prop_to_bool P = false
H1: ~ PP = Falseassumption. Qed.P: Prop
H: P -> prop_to_bool P = true
H0: prop_to_bool P = false
H1: ~ P~ Pb: boolprop_to_bool (bool_to_prop b) = bb: boolprop_to_bool (bool_to_prop b) = bb: bool
H: (bool_to_prop b -> prop_to_bool (bool_to_prop b) = true) /\ (~ bool_to_prop b -> prop_to_bool (bool_to_prop b) = false)prop_to_bool (bool_to_prop b) = bb: bool
H: bool_to_prop b -> prop_to_bool (bool_to_prop b) = true
H0: ~ bool_to_prop b -> prop_to_bool (bool_to_prop b) = falseprop_to_bool (bool_to_prop b) = bH: bool_to_prop true -> prop_to_bool (bool_to_prop true) = true
H0: ~ bool_to_prop true -> prop_to_bool (bool_to_prop true) = falseprop_to_bool (bool_to_prop true) = trueH: bool_to_prop false -> prop_to_bool (bool_to_prop false) = true
H0: ~ bool_to_prop false -> prop_to_bool (bool_to_prop false) = falseprop_to_bool (bool_to_prop false) = falseH: bool_to_prop true -> prop_to_bool (bool_to_prop true) = true
H0: ~ bool_to_prop true -> prop_to_bool (bool_to_prop true) = falseprop_to_bool (bool_to_prop true) = trueH: True -> prop_to_bool True = true
H0: ~ True -> prop_to_bool True = falseprop_to_bool True = truetrivial.H: True -> prop_to_bool True = true
H0: ~ True -> prop_to_bool True = falseTrueH: bool_to_prop false -> prop_to_bool (bool_to_prop false) = true
H0: ~ bool_to_prop false -> prop_to_bool (bool_to_prop false) = falseprop_to_bool (bool_to_prop false) = falseH: False -> prop_to_bool False = true
H0: ~ False -> prop_to_bool False = falseprop_to_bool False = falseapply trivially_not_false. Qed.H: False -> prop_to_bool False = true
H0: ~ False -> prop_to_bool False = false~ FalseP: PropP + (~ P)P: PropP + (~ P)P: Prop
H: P -> prop_to_bool P = true
H0: ~ P -> prop_to_bool P = falseP + (~ P)P: Prop
H: P -> true = true
H0: ~ P -> true = falseP + (~ P)P: Prop
H: P -> false = true
H0: ~ P -> false = falseP + (~ P)P: Prop
H: P -> true = true
H0: ~ P -> true = falseP + (~ P)P: Prop
H: P -> true = true
H0: ~ P -> true = falsePP: Prop
H: P -> true = true
H0: ~ P -> true = false
H1: PPP: Prop
H: P -> true = true
H0: ~ P -> true = false
H1: ~ PPassumption.P: Prop
H: P -> true = true
H0: ~ P -> true = false
H1: PPP: Prop
H: P -> true = true
H0: ~ P -> true = false
H1: ~ PPP: Prop
H: P -> true = true
H0: true = false
H1: ~ PPapply true_is_not_false.P: Prop
H: P -> true = true
H1: ~ Ptrue <> falseP: Prop
H: P -> false = true
H0: ~ P -> false = falseP + (~ P)P: Prop
H: P -> false = true
H0: ~ P -> false = false~ PP: Prop
H: P -> false = true
H0: ~ P -> false = false
H1: P~ PP: Prop
H: P -> false = true
H0: ~ P -> false = false
H1: ~ P~ PP: Prop
H: P -> false = true
H0: ~ P -> false = false
H1: P~ PP: Prop
H: false = true
H0: ~ P -> false = false
H1: P~ PP: Prop
H0: ~ P -> false = false
H1, H: Pfalse <> trueapply true_is_not_false.P: Prop
H0: ~ P -> false = false
H1, H: Ptrue <> falseassumption. Defined. Section GeneralDefByCases. Context {A : Type}.P: Prop
H: P -> false = true
H0: ~ P -> false = false
H1: ~ P~ P
命題 P が成り立つときと成り立たないときの場合分けによって値を与えることができる:
Definition general_definition_by_cases (P : Prop) (x : P -> A) (y : ~ P -> A) : A := match every_proposition_is_decidable P with | inl p => x p | inr q => y q end.A: Type
P: Prop
x: P -> A
y: ~ P -> Aforall p : P, general_definition_by_cases P x y = x pA: Type
P: Prop
x: P -> A
y: ~ P -> Aforall p : P, general_definition_by_cases P x y = x pA: Type
P: Prop
x: P -> A
y: ~ P -> Aforall p : P, match every_proposition_is_decidable P with | inl p0 => x p0 | inr q => y q end = x pA: Type
P: Prop
x: P -> A
y: ~ P -> A
p: Pforall p0 : P, x p = x p0A: Type
P: Prop
x: P -> A
y: ~ P -> A
n: ~ Pforall p : P, y n = x pA: Type
P: Prop
x: P -> A
y: ~ P -> A
p: Pforall p0 : P, x p = x p0A: Type
P: Prop
x: P -> A
y: ~ P -> A
p, p0: Px p = x p0apply proof_irrelevance.A: Type
P: Prop
x: P -> A
y: ~ P -> A
p, p0: Pp = p0contradiction. Qed.A: Type
P: Prop
x: P -> A
y: ~ P -> A
n: ~ Pforall p : P, y n = x pA: Type
P: Prop
x: P -> A
y: ~ P -> Aforall q : ~ P, general_definition_by_cases P x y = y qA: Type
P: Prop
x: P -> A
y: ~ P -> Aforall q : ~ P, general_definition_by_cases P x y = y qA: Type
P: Prop
x: P -> A
y: ~ P -> Aforall q : ~ P, match every_proposition_is_decidable P with | inl p => x p | inr q0 => y q0 end = y qA: Type
P: Prop
x: P -> A
y: ~ P -> A
p: Pforall q : ~ P, x p = y qA: Type
P: Prop
x: P -> A
y: ~ P -> A
n: ~ Pforall q : ~ P, y n = y qcontradiction.A: Type
P: Prop
x: P -> A
y: ~ P -> A
p: Pforall q : ~ P, x p = y qA: Type
P: Prop
x: P -> A
y: ~ P -> A
n: ~ Pforall q : ~ P, y n = y qA: Type
P: Prop
x: P -> A
y: ~ P -> A
n, q: ~ Py n = y qapply proof_irrelevance. Qed. End GeneralDefByCases. Section DefByCases. Context {A : Type}. Variable (P : Prop). Variable (x : A). Variable (y : A). Definition definition_by_cases : A := match every_proposition_is_decidable P with | inl _ => x | inr _ => y end.A: Type
P: Prop
x: P -> A
y: ~ P -> A
n, q: ~ Pn = qA: Type
P: Prop
x, y: AP -> definition_by_cases = xA: Type
P: Prop
x, y: AP -> definition_by_cases = xA: Type
P: Prop
x, y: A
H: Pdefinition_by_cases = xA: Type
P: Prop
x, y: A
H: Pmatch every_proposition_is_decidable P with | inl _ => x | inr _ => y end = xA: Type
P: Prop
x, y: A
H, p: Px = xA: Type
P: Prop
x, y: A
H: P
n: ~ Py = xreflexivity.A: Type
P: Prop
x, y: A
H, p: Px = xcontradiction. Qed.A: Type
P: Prop
x, y: A
H: P
n: ~ Py = xA: Type
P: Prop
x, y: A~ P -> definition_by_cases = yA: Type
P: Prop
x, y: A~ P -> definition_by_cases = yA: Type
P: Prop
x, y: A
H: ~ Pdefinition_by_cases = yA: Type
P: Prop
x, y: A
H: ~ Pmatch every_proposition_is_decidable P with | inl _ => x | inr _ => y end = yA: Type
P: Prop
x, y: A
H: ~ P
p: Px = yA: Type
P: Prop
x, y: A
H, n: ~ Py = ycontradiction.A: Type
P: Prop
x, y: A
H: ~ P
p: Px = yreflexivity. Qed. End DefByCases.A: Type
P: Prop
x, y: A
H, n: ~ Py = y