フォワードな定理記述の実験(暫定版)

一応できた。sectionは要らないみたい。

/-! 写像と関係 -/
namespace My

/- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -/
section Logic

def MP {A B: Prop}
  (p:A → B) (a: A) 
  : B
:= p a

def Inst {X: Type} {P: X → Prop}
 (w: ∀(x: X), P x) (a : X)
 : P a
:= w a

def Cut {A B C : Prop}
 (p: A → B) (q: B → C)
 : A → C
:= q ∘ p

end Logic
/- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -/
#check MP
#check Inst
#check Cut

def IsInjective {X Y: Type} (f: X → Y) : Prop :=
 ∀(x y : X),( f x = f y → x = y )
#print IsInjective

/- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -/
namespace inj_inj_comp_inj 
section 
/-!
## 単射と単射の結合は単射である
-/

variable -- 前提/コンテキスト
 {X Y Z : Type}
 (f:X → Y) (g: Y → Z)

def target': Prop := 
 (IsInjective f) ∧ (IsInjective g) → (IsInjective (g∘f))
#check target'  -- {X Y Z : Type} (f : X → Y) (g : Y → Z) : Prop

def target: Prop := 
 (IsInjective f) → (IsInjective g) → (IsInjective (g∘f))
#check target  -- {X Y Z : Type} (f : X → Y) (g : Y → Z) : Prop

def lemma
  (p : IsInjective f)
  (q : IsInjective g) 
-- 結論は最初かかないでも、後で足せる。
:= 
have p' : ∀(x x' : X),( f x = f x' →  x =  x' ) := p
have q' : ∀(y y' : Y),( g y = g y' →  y =  y' ) := q
let con := fun (x x' : X) =>
  let r : ∀(x x' : X),( g (f x) = g (f x') → f x = f x' ) :=
      fun x x'=> q' (y := f x) (y' := f x')
  Cut (r x  x') (p' x x')
show ∀(x x' : X),( g (f x) = g (f x') →  x =  x' ) from con

#check lemma -- {X Y Z : Type} (f : X → Y) (g : Y → Z) (p : IsInjective f) (q : IsInjective g) (x x' : X)
--  (a✝ : g (f x) = g (f x')) : x = x'
#check lemma f g --  IsInjective f → IsInjective g → ∀ (x x' : X), g (f x) = g (f x') → x = x'


def main : target f g := 
  fun (p : IsInjective f) (q : IsInjective g) =>
    lemma f g p q
#check main
#print main
#print main.proof_1

end -- section
end inj_inj_comp_inj
/- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -/
#check inj_inj_comp_inj.main
#print inj_inj_comp_inj.target

end My
#check My.inj_inj_comp_inj.main
#print My.inj_inj_comp_inj.target