Test 5
Find as many graphs with exactly 4 dots and 2 arrows as you can, with no two of your graphs isomorphic. (Draw an internal diagram of each of your graphs.)
def Example : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 2
toTgt := fun
| 0 => 1
| 1 => 1
}
Hint: The number of such graphs is between 10 and 15.
Solution: Problem 1
There are 11 such graphsβ2 graphs with exactly 2 loops, 3 graphs with exactly one loop, and 6 graphs with no loops. We provide definitions below.
Graphs with exactly 2 loops:
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 0
toTgt := fun
| 0 => 0
| 1 => 0
}
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 1
toTgt := fun
| 0 => 0
| 1 => 1
}
Graphs with exactly 1 loop:
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 0
toTgt := fun
| 0 => 0
| 1 => 1
}
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 1
toTgt := fun
| 0 => 0
| 1 => 0
}
def Gβ
: IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 1
toTgt := fun
| 0 => 0
| 1 => 2
}
Graphs with no loops:
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 0
toTgt := fun
| 0 => 1
| 1 => 1
}
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 1
toTgt := fun
| 0 => 1
| 1 => 2
}
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 2
toTgt := fun
| 0 => 1
| 1 => 3
}
def Gβ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 1
toTgt := fun
| 0 => 1
| 1 => 0
}
def Gββ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 0
| 1 => 2
toTgt := fun
| 0 => 1
| 1 => 1
}
def Gββ : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 4
toSrc := fun
| 0 => 1
| 1 => 1
toTgt := fun
| 0 => 0
| 1 => 2
}
abbrev IrreflexiveGraph.D : IrreflexiveGraph := {
carrierA := Empty
carrierD := Unit
toSrc := Empty.elim
toTgt := Empty.elim
}
abbrev IrreflexiveGraph.A : IrreflexiveGraph := {
carrierA := Unit
carrierD := Fin 2
toSrc := fun _ β¦ 0
toTgt := fun _ β¦ 1
}
abbrev I : IrreflexiveGraph := {
carrierA := Fin 2
carrierD := Fin 3
toSrc := fun
| 0 => 0
| 1 => 1
toTgt := fun
| 0 => 1
| 1 => 2
}
Find numbers a, b, c such that
I \times I = aD + bA + cI
Hint: First try to draw {I \times I}
To check your picture, be sure that the two projection maps are maps of graphs!
Solution: Problem 2
We can formalise {I \times I} as follows:
abbrev IxI : IrreflexiveGraph := {
carrierA := Fin 4
carrierD := Fin 3 Γ Fin 3
toSrc := fun
| 0 => (0, 0)
| 1 => (0, 1)
| 2 => (1, 0)
| 3 => (1, 1)
toTgt := fun
| 0 => (1, 1)
| 1 => (1, 2)
| 2 => (2, 1)
| 3 => (2, 2)
}
We then find that {I \times I} is isomorphic to the graph {2D + 2A + I}, which we can formalise using Lean's Sigma type (dependent pairs) as follows:
open IrreflexiveGraph
abbrev Fam2D2AI : Fin 5 β IrreflexiveGraph
| 0 => D
| 1 => D
| 2 => A
| 3 => A
| 4 => I
def G : IrreflexiveGraph := {
carrierA := Ξ£ i, (Fam2D2AI i).carrierA
carrierD := Ξ£ i, (Fam2D2AI i).carrierD
toSrc := fun β¨i, aβ© β¦ β¨i, (Fam2D2AI i).toSrc aβ©
toTgt := fun β¨i, aβ© β¦ β¨i, (Fam2D2AI i).toTgt aβ©
}
We prove the isomorphism {I \times I \cong 2D + 2A + I} below.
example : IxI β
G := {
hom := β¨
(fun
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β’ (fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toSrc =
G.toSrc β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1 β§
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt =
G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1
β’ (fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toSrc =
G.toSrc β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1β’ (fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt =
G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1
all_goals
a:IxI.carrierAβ’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
a =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
a; β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨0, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨0, β―β©)β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨1, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨1, β―β©)β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨2, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨2, β―β©)β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨3, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨3, β―β©) β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨0, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨0, β―β©)β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨1, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨1, β―β©)β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨2, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨2, β―β©)β’ ((fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).2 β
IxI.toTgt)
((fun i β¦ i) β¨3, β―β©) =
(G.toTgt β
(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©).1)
((fun i β¦ i) β¨3, β―β©) All goals completed! π
β©
inv := β¨
(fun
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, ()β© => 1
| β¨3, ()β© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun
| β¨0, ()β© => (0, 2)
| β¨1, ()β© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β’ (fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toSrc =
IxI.toSrc β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1 β§
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt =
IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1
β’ (fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toSrc =
IxI.toSrc β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1β’ (fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt =
IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1
all_goals
i:Fin 5a:(Fam2D2AI i).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨i, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨i, aβ©
a:(Fam2D2AI ((fun i β¦ i) β¨0, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨0, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨0, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨1, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨1, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨1, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨2, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨2, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨2, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨3, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨3, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨3, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨4, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨4, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨4, β―β©, aβ©
a:(Fam2D2AI ((fun i β¦ i) β¨0, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨0, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨0, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨1, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨1, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨1, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨2, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨2, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨2, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨3, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨3, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨3, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨4, β―β©)).carrierAβ’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨4, β―β©, aβ© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨4, β―β©, aβ© β’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© β’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ ((fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).2 β
G.toTgt)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(IxI.toTgt β
(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)).1)
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© All goals completed! π
β©
hom_inv_id := β’ β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© =
π IxI
β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).1 =
(β(π IxI)).1β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2 =
(β(π IxI)).2
all_goals
x:IxI.carrierDβ’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
x =
(β(π IxI)).2 x; β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨0, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨0, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨1, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨1, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨2, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨2, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨0, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨0, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨1, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨1, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨2, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨2, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨2, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨2, β―β©) β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨0, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨0, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨1, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨1, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨2, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨0, β―β©, (fun i β¦ i) β¨2, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨0, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨0, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨1, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨1, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨2, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨1, β―β©, (fun i β¦ i) β¨2, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©)β’ (β(β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© β
β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β©)).2
((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨2, β―β©) =
(β(π IxI)).2 ((fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨2, β―β©) All goals completed! π
inv_hom_id := β’ β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β© =
π G
β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1 =
(β(π G)).1β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2 =
(β(π G)).2
β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1 =
(β(π G)).1 i:Fin 5a:(Fam2D2AI i).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨i, aβ© =
(β(π G)).1 β¨i, aβ©
a:(Fam2D2AI ((fun i β¦ i) β¨0, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨0, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨0, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨1, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨1, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨1, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨2, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨2, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨2, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨3, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨3, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨3, β―β©, aβ©a:(Fam2D2AI ((fun i β¦ i) β¨4, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨4, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨4, β―β©, aβ©
a:(Fam2D2AI ((fun i β¦ i) β¨0, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨0, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨0, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨1, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨1, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨1, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨2, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨2, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨2, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨3, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨3, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨3, β―β©, aβ© All goals completed! π
a:(Fam2D2AI ((fun i β¦ i) β¨4, β―β©)).carrierAβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨4, β―β©, aβ© =
(β(π G)).1 β¨(fun i β¦ i) β¨4, β―β©, aβ© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).1 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).1 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).1 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).1
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).1 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© All goals completed! π
β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2 =
(β(π G)).2 i:Fin 5d:(Fam2D2AI i).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨i, dβ© =
(β(π G)).2 β¨i, dβ©
d:(Fam2D2AI ((fun i β¦ i) β¨0, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨0, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨0, β―β©, dβ©d:(Fam2D2AI ((fun i β¦ i) β¨1, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨1, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨1, β―β©, dβ©d:(Fam2D2AI ((fun i β¦ i) β¨2, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨2, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨2, β―β©, dβ©d:(Fam2D2AI ((fun i β¦ i) β¨3, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨3, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨3, β―β©, dβ©d:(Fam2D2AI ((fun i β¦ i) β¨4, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, dβ©
d:(Fam2D2AI ((fun i β¦ i) β¨0, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨0, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨0, β―β©, dβ© All goals completed! π
d:(Fam2D2AI ((fun i β¦ i) β¨1, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨1, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨1, β―β©, dβ© All goals completed! π
d:(Fam2D2AI ((fun i β¦ i) β¨2, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨2, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨2, β―β©, dβ© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©β© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨2, β―β©, (fun i β¦ i) β¨1, β―β©β© All goals completed! π
d:(Fam2D2AI ((fun i β¦ i) β¨3, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨3, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨3, β―β©, dβ© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨1, β―β©β© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨3, β―β©, (fun i β¦ i) β¨1, β―β©β© All goals completed! π
d:(Fam2D2AI ((fun i β¦ i) β¨4, β―β©)).carrierDβ’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, dβ© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, dβ© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨2, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨2, β―β©β© β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨0, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨1, β―β©β©β’ (β(β¨(fun x β¦
match x with
| 0 => β¨4, 0β©
| 1 => β¨2, ()β©
| 2 => β¨3, ()β©
| 3 => β¨4, 1β©,
fun x β¦
match x with
| (0, 0) => β¨4, 0β©
| (0, 1) => β¨2, 0β©
| (0, 2) => β¨0, ()β©
| (1, 0) => β¨3, 0β©
| (1, 1) => β¨4, 1β©
| (1, 2) => β¨2, 1β©
| (2, 0) => β¨1, ()β©
| (2, 1) => β¨3, 1β©
| (2, 2) => β¨4, 2β©),
β―β© β
β¨(fun x β¦
match x with
| β¨0, aβ© => nomatch a
| β¨1, aβ© => nomatch a
| β¨2, PUnit.unitβ© => 1
| β¨3, PUnit.unitβ© => 2
| β¨4, 0β© => 0
| β¨4, 1β© => 3,
fun x β¦
match x with
| β¨0, PUnit.unitβ© => (0, 2)
| β¨1, PUnit.unitβ© => (2, 0)
| β¨2, 0β© => (0, 1)
| β¨2, 1β© => (1, 2)
| β¨3, 0β© => (1, 0)
| β¨3, 1β© => (2, 1)
| β¨4, 0β© => (0, 0)
| β¨4, 1β© => (1, 1)
| β¨4, 2β© => (2, 2)),
β―β©)).2
β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨2, β―β©β© =
(β(π G)).2 β¨(fun i β¦ i) β¨4, β―β©, (fun i β¦ i) β¨2, β―β©β© All goals completed! π
}