Created
May 7, 2020 04:07
-
-
Save digama0/16c62d1af34212de2e3fba380d87c043 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import tactic.rcases | |
/- | |
The problem is originally presented in: | |
A. Pease, G. Sutcliffe, N. Siegel, and S. Trac, “Large Theory | |
Reasoning with SUMO at CASC,” pp. 1–8, Jul. 2009. | |
Here we present the natural deduction proof in Lean. | |
-/ | |
constant U : Type | |
constants SetOrClass Set Class Object Entity NullList_m List | |
CorpuscularObject Invertebrate Vertebrate Animal SpinalColumn | |
Organism Agent Physical Abstract | |
subclass_m TransitiveRelation PartialOrderingRelation Relation : U | |
constant BananaSlug10 : U | |
@[class] constants exhaustiveDecomposition3 disjointDecomposition3 partition3 : U → U → U → Prop | |
@[class] constant ins : U → U → Prop | |
@[class] constant subclass : U → U → Prop | |
@[class] constant disjoint : U → U → Prop | |
@[class] constant component : U → U → Prop | |
@[class] constant part : U → U → Prop | |
@[class] constant inList : U → U → Prop | |
@[class] constant ConsFn : U → U → U | |
@[class] constant ListFn1 : U → U | |
@[class] constant ListFn2 : U → U → U | |
@[class] constant ListFn3 : U → U → U → U | |
@[class] noncomputable def subclass1 := subclass | |
@[instance] def subclass1_single (x y : U) [subclass1 x y] : subclass x y := by assumption | |
/- SUMO axioms -/ | |
@[instance] axiom a13 : ins subclass_m PartialOrderingRelation | |
@[instance] axiom a15 (x y z : U) [ins x SetOrClass] [ins y SetOrClass] | |
[ins z x] [subclass1 x y] : ins z y | |
/- EDITED (see https://github.com/own-pt/cl-krr/issues/23) -/ | |
axiom a72773 (a : U) [ins a Animal] : (¬ ∃ p : U, ins p SpinalColumn ∧ part p a) | |
→ ¬ ins a Vertebrate | |
/- EDITED -/ | |
axiom a72774 : ¬ ∃ s : U, ins s SpinalColumn ∧ part s BananaSlug10 | |
axiom a72761 (x row0 row1 : U) [ins row0 Entity] [ins row1 Entity] [ins x Entity] : | |
(ListFn3 x row0 row1 = ConsFn x (ListFn2 row0 row1)) | |
axiom a72767 (x y : U) [ins x Entity] [ins y Entity] : | |
((ListFn2 x y) = (ConsFn x (ConsFn y NullList_m))) | |
axiom a72768 (x : U) [ins x Entity] : (ListFn1 x = ConsFn x NullList_m) | |
axiom a72769 (x : U) [ins x Entity] : ¬ inList x NullList_m | |
axiom a72770 (L x y : U) [ins x Entity] [ins y Entity] [ins L List] : | |
((inList x (ConsFn y L)) ↔ ((x = y) ∨ inList x L)) | |
@[instance] axiom a67959 : ins NullList_m List | |
@[instance] axiom a67958 : ins List SetOrClass | |
@[instance] axiom a72772 : ins BananaSlug10 Animal | |
@[instance] axiom a72771 : ins Animal SetOrClass | |
@[instance] axiom a72778 : ins Invertebrate SetOrClass | |
@[instance] axiom a71402 : ins Vertebrate SetOrClass | |
@[instance] axiom a71371 : ins Organism SetOrClass | |
@[instance] axiom a71872 : ins Agent SetOrClass | |
@[instance] axiom a71669 : ins Object SetOrClass | |
@[instance] axiom a69763 : ins Physical SetOrClass | |
@[instance] axiom a67331 : ins Entity SetOrClass | |
@[instance] axiom a67448 : ins SetOrClass SetOrClass | |
@[instance] axiom a68771 : ins Abstract SetOrClass | |
@[instance] axiom a68763 : ins Relation SetOrClass | |
@[instance] axiom a71844 : ins TransitiveRelation SetOrClass | |
@[instance] axiom a72180 : ins PartialOrderingRelation SetOrClass | |
@[instance] axiom a71370 : partition3 Animal Vertebrate Invertebrate | |
axiom a67131 {c row0 row1 : U} [ins c Class] [ins row0 Class] [ins row1 Class] : | |
(partition3 c row0 row1 ↔ (exhaustiveDecomposition3 c row0 row1 ∧ disjointDecomposition3 c row0 row1)) | |
-- EDITED (see https://github.com/own-pt/cl-krr/issues/22) | |
axiom a67115 : | |
∀ (row0 row1 c obj : U), | |
∃ (item : U), | |
ins item SetOrClass ∧ | |
(ins obj Entity → | |
ins c SetOrClass → ins c Class → | |
ins row0 Class → ins row0 Entity → | |
ins row1 Class → ins row1 Entity → | |
exhaustiveDecomposition3 c row0 row1 → ins obj c → | |
inList item (ListFn2 row0 row1) ∧ ins obj item) | |
@[instance] axiom a67447 : partition3 SetOrClass Set Class | |
axiom a67172 : ∃ x : U, ins x Entity | |
axiom a67173 : ∀ {c : U}, ins c Class ↔ subclass c Entity | |
@[instance] axiom a67818 : subclass1 PartialOrderingRelation TransitiveRelation | |
@[instance] axiom a67809 (x y z : U) [ins x SetOrClass] [ins y SetOrClass] [ins z SetOrClass] | |
[ins subclass_m TransitiveRelation] [subclass x y] [subclass1 y z] : subclass x z | |
@[instance] axiom a71382 : subclass1 Vertebrate Animal | |
@[instance] axiom a71383 : subclass1 Invertebrate Animal | |
@[instance] axiom a71369 : subclass1 Animal Organism | |
@[instance] axiom a71340 : subclass1 Organism Agent | |
@[instance] axiom a67315 : subclass1 Agent Object | |
@[instance] axiom a67177 : subclass1 Object Physical | |
@[instance] axiom a67174 : subclass1 Physical Entity | |
@[instance] axiom a67446 : subclass1 SetOrClass Abstract | |
@[instance] axiom a67332 : subclass1 Abstract Entity | |
@[instance] axiom a67954 : subclass1 List Relation | |
@[instance] axiom a67450 : subclass1 Relation Abstract | |
-- commented in list.kif | |
@[instance] axiom novo1 (x L : U) [ins L Entity] [ins L List] : ins (ConsFn x L) List | |
-- some initial tests | |
lemma VertebrateAnimal (x : U) [ins x Vertebrate] : ins x Animal := by apply_instance | |
lemma subclass_TransitiveRelation : ins subclass_m TransitiveRelation := by apply_instance | |
lemma VertebrateOrganism (x : U) [ins x Vertebrate] : ins x Organism := by apply_instance | |
lemma VertebrateEntity (x : U) [ins x Vertebrate] : ins x Entity := by apply_instance | |
lemma listLemma [hne : nonempty U] {x y z : U} [ins x Entity] [ins y Entity] [ins z Entity] : | |
inList x (ListFn2 y z) → x = y ∨ x = z := | |
begin | |
intros h1, | |
rw a72767 at h1, | |
have h2 : x = y ∨ inList x (ConsFn z NullList_m), {rwa ← a72770}, | |
cases h2, | |
{ exact or.inl h2 }, | |
{ have h3 : x = z ∨ inList x NullList_m, {rwa ← a72770}, | |
cases h3, | |
{ exact or.inr h3 }, | |
{ exfalso, | |
exact a72769 x h3 } } | |
end | |
lemma lX [hne : nonempty U] {x c c1 c2} | |
[ins c SetOrClass] [ins c1 SetOrClass] [ins c2 SetOrClass] | |
[ins c Class] [ins c1 Class] [ins c2 Class] [ins x Entity] : | |
partition3 c c1 c2 → ins x c → ¬ ins x c1 → ins x c2 := | |
begin | |
intros h1 h2 h3, | |
obtain ⟨h4a, h4b⟩ := a67131.1 h1, | |
obtain ⟨b, h7, h8⟩ := a67115 _ _ _ _, resetI, | |
cases h8 _ _ _ _ _ _ _ h4a h2 with h8a h8b; try {apply_instance}, | |
obtain rfl | rfl := listLemma h8a, | |
{contradiction}, {assumption} | |
end | |
set_option class.instance_max_depth 60 | |
lemma subclass_animal_entity : subclass Animal Entity := by apply_instance | |
lemma subclass_vertebrate_entity : subclass Vertebrate Entity := by apply_instance | |
lemma subclass_invertebrate_entity : subclass Invertebrate Entity := by apply_instance | |
lemma ins_banana_entity : ins BananaSlug10 Entity := by apply_instance | |
lemma ins_animal_class : ins Animal Class := a67173.2 $ by apply_instance | |
lemma l0 [nonempty U] : ¬(ins BananaSlug10 Vertebrate) := a72773 _ a72774 | |
instance Vertebrate_class : ins Vertebrate Class := a67173.2 $ by apply_instance | |
instance Invertebrate_class : ins Invertebrate Class := a67173.2 $ by apply_instance | |
instance Animal_class : ins Animal Class := a67173.2 $ by apply_instance | |
theorem Banana_Invertebrate [nonempty U] : ins BananaSlug10 Invertebrate := | |
by apply lX a71370 _ l0; apply_instance | |
example (X Y C : U) [h : partition3 C X Y] : subclass X C ∧ subclass Y C := | |
sorry -- not provable | |
example (h : ins SetOrClass SetOrClass) : false := sorry -- not provable |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment