Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
(** This file continues the development of algebra [Operation]. It gives a way to construct operations using (conventional) curried functions, and shows that such curried operations are equivalent to the uncurried operations [Operation]. *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import
HoTT.Types
HoTT.Spaces.Finite
HoTT.Spaces.Nat.Core.LocalOpen Scope Algebra_scope.LocalOpen Scope nat_scope.(** Functions [head_dom'] and [head_dom] are used to get the first element of a nonempty operation domain [a : forall i, A (ss i)]. *)MonomorphicDefinitionhead_dom' {σ} (A : Carriers σ) (n : nat)
: forall (N : n > 0) (ss : FinSeq n (Sort σ)) (a : foralli, A (ss i)),
A (fshead' n N ss)
:= match n with
| 0 => funNss_ => Empty_rec (lt_irrefl _ N)
| n'.+1 => funNssa => a fin_zero
end.MonomorphicDefinitionhead_dom {σ} (A : Carriers σ) {n : nat}
(ss : FinSeq n.+1 (Sort σ)) (a : foralli, A (ss i))
: A (fshead ss)
:= head_dom' A n.+1 _ ss a.(** Functions [tail_dom'] and [tail_dom] are used to obtain the tail of an operation domain [a : forall i, A (ss i)]. *)MonomorphicDefinitiontail_dom' {σ} (A : Carriers σ) (n : nat)
: forall (ss : FinSeq n (Sort σ)) (a : foralli, A (ss i)) (i : Fin (nat_pred n)),
A (fstail' n ss i)
:= match n with
| 0 => funss_i => Empty_rec i
| n'.+1 => funssai => a (fsucc i)
end.MonomorphicDefinitiontail_dom {σ} (A : Carriers σ) {n : nat}
(ss : FinSeq n.+1 (Sort σ)) (a : foralli, A (ss i))
: foralli, A (fstail ss i)
:= tail_dom' A n.+1 ss a.(** Functions [cons_dom'] and [cons_dom] to add an element to the front of a given domain [a : forall i, A (ss i)]. *)MonomorphicDefinitioncons_dom' {σ} (A : Carriers σ) {n : nat}
: forall (i : Fin n) (ss : FinSeq n (Sort σ)) (N : n > 0),
A (fshead' n N ss) -> (foralli, A (fstail' n ss i)) -> A (ss i)
:= fin_ind
(funni =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) -> (foralli, A (fstail' n ss i)) -> A (ss i))
(funn'_zx_ => x)
(funn'i'_ => fun___xs => xs i').Definitioncons_dom {σ} (A : Carriers σ)
{n : nat} (ss : FinSeq n.+1 (Sort σ))
(x : A (fshead ss)) (xs : foralli, A (fstail ss i))
: foralli : Fin n.+1, A (ss i)
:= funi => cons_dom' A i ss _ x xs.(** The empty domain: *)Definitionnil_dom {σ} (A : Carriers σ) (ss : FinSeq 0 (Sort σ))
: foralli : Fin 0, A (ss i)
:= Empty_ind (A o ss).(** A specialization of [Operation] to finite [Fin n] arity. *)DefinitionFiniteOperation {σ : Signature} (A : Carriers σ)
{n : nat} (ss : FinSeq n (Sort σ)) (t : Sort σ) : Type
:= Operation A {| Arity := Fin n; sorts_dom := ss; sort_cod := t |}.(** A type of curried operations<<CurriedOperation A [s1, ..., sn] t := A s1 -> ... -> A sn -> A t.>>*)FixpointCurriedOperation {σ} (A : Carriers σ) {n : nat}
: (FinSeq n (Sort σ)) -> Sort σ -> Type
:= match n with
| 0 => funsst => A t
| n'.+1 =>
funsst => A (fshead ss) -> CurriedOperation A (fstail ss) t
end.(** Function [operation_uncurry] is used to uncurry an operation<<operation_uncurry A [s1, ..., sn] t (op : CurriedOperation A [s1, ..., sn] t) : FiniteOperation A [s1, ..., sn] t := fun (x1 : A s1, ..., xn : A xn) => op x1 ... xn>>See [equiv_operation_curry] below. *)Fixpointoperation_uncurry {σ} (A : Carriers σ) {n : nat}
: forall (ss : FinSeq n (Sort σ)) (t : Sort σ),
CurriedOperation A ss t -> FiniteOperation A ss t
:= match n with
| 0 => funsstop_ => op
| n'.+1 =>
funsstopa =>
operation_uncurry A (fstail ss) t (op (a fin_zero)) (a o fsucc)
end.
forall (σ : Signature) (A : Carriers σ),
nat ->
forall (s1s2t : Sort σ)
(ss := fscons s1 (fscons s2 fsnil))
(op : CurriedOperation A ss t),
(foralli : Fin 2, A (ss i)) ->
operation_uncurry A ss t op =
(funa : foralli : Arity
{|
Arity := Fin 2;
sorts_dom := ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin 2;
sorts_dom := ss;
sort_cod := t
|} i) =>
op (a fin_zero) (a (fsucc fin_zero)))
forall (σ : Signature) (A : Carriers σ),
nat ->
forall (s1s2t : Sort σ)
(ss := fscons s1 (fscons s2 fsnil))
(op : CurriedOperation A ss t),
(foralli : Fin 2, A (ss i)) ->
operation_uncurry A ss t op =
(funa : foralli : Arity
{|
Arity := Fin 2;
sorts_dom := ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin 2;
sorts_dom := ss;
sort_cod := t
|} i) =>
op (a fin_zero) (a (fsucc fin_zero)))
reflexivity.Qed.(** Function [operation_curry] is used to curry an operation<<operation_curry A [s1, ..., sn] t (op : FiniteOperation A [s1, ..., sn] t) : CurriedOperation A [s1, ..., sn] t := fun (x1 : A s1) ... (xn : A xn) => op (x1, ..., xn)>>See [equiv_operation_curry] below. *)Fixpointoperation_curry {σ} (A : Carriers σ) {n : nat}
: forall (ss : FinSeq n (Sort σ)) (t : Sort σ),
FiniteOperation A ss t -> CurriedOperation A ss t
:= match n with
| 0 => funsstop => op (Empty_ind _)
| n'.+1 =>
funsstopx =>
operation_curry A (fstail ss) t (op o cons_dom A ss x)
end.
forall (σ : Signature) (A : Carriers σ),
nat ->
forall (s1s2t : Sort σ)
(ss := fscons s1 (fscons s2 fsnil))
(op : FiniteOperation A ss t),
A s1 ->
A s2 ->
operation_curry A ss t op =
(fun (x1 : A (fshead ss))
(x2 : A (fshead (fstail ss))) =>
op
(cons_dom A ss x1
(cons_dom A (fstail ss) x2
(nil_dom A (fstail (fstail ss))))))
forall (σ : Signature) (A : Carriers σ),
nat ->
forall (s1s2t : Sort σ)
(ss := fscons s1 (fscons s2 fsnil))
(op : FiniteOperation A ss t),
A s1 ->
A s2 ->
operation_curry A ss t op =
(fun (x1 : A (fshead ss))
(x2 : A (fshead (fstail ss))) =>
op
(cons_dom A ss x1
(cons_dom A (fstail ss) x2
(nil_dom A (fstail (fstail ss))))))
reflexivity.Qed.
σ: Signature A: Carriers σ n: nat
forall (i : Fin n) (ss : FinSeq n (Sort σ))
(N : n > 0) (a : foralli0 : Fin n, A (ss i0)),
cons_dom' A i ss N (head_dom' A n N ss a)
(tail_dom' A n ss a) = a i
σ: Signature A: Carriers σ n: nat
forall (i : Fin n) (ss : FinSeq n (Sort σ))
(N : n > 0) (a : foralli0 : Fin n, A (ss i0)),
cons_dom' A i ss N (head_dom' A n N ss a)
(tail_dom' A n ss a) = a i
σ: Signature A: Carriers σ n: nat i: Fin n
forall (ss : FinSeq n (Sort σ)) (N : n > 0)
(a : foralli : Fin n, A (ss i)),
cons_dom' A i ss N (head_dom' A n N ss a)
(tail_dom' A n ss a) = a i
cons_dom' A fin_zero ss N (head_dom' A n.+1 N ss a)
(tail_dom' A n.+1 ss a) = a fin_zero
σ: Signature A: Carriers σ n: nat i: Fin n IHi: forall (ss : FinSeq n (Sort σ)) (N : n > 0) (a : foralli : Fin n, A (ss i)),
cons_dom' A i ss N (head_dom' A n N ss a) (tail_dom' A n ss a) = a i ss: FinSeq n.+1 (Sort σ) N: n.+1 > 0 a: foralli : Fin n.+1, A (ss i)
cons_dom' A (fsucc i) ss N (head_dom' A n.+1 N ss a)
(tail_dom' A n.+1 ss a) = a (fsucc i)
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) ->
(foralli0 : Fin (nat_pred n), A (fstail' n ss i0)) ->
A (ss i))
(fun (n' : nat) (ss : Fin n'.+1 -> Sort σ)
(z : n'.+1 > 0) (x : A (fshead' n'.+1 z ss))
(_ : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => x)
(fun (n' : nat) (i' : Fin n')
(_ : forall (ss : Fin n' -> Sort σ) (N : n' > 0),
A (fshead' n' N ss) ->
(foralli : Fin (nat_pred n'),
A (fstail' n' ss i)) -> A (ss i'))
(ss : Fin n'.+1 -> Sort σ) (N : n'.+1 > 0)
(_ : A (fshead' n'.+1 N ss))
(xs : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => xs i') fin_zero
ss N (head_dom' A n.+1 N ss a)
(tail_dom' A n.+1 ss a) = a fin_zero
σ: Signature A: Carriers σ n: nat i: Fin n IHi: forall (ss : FinSeq n (Sort σ)) (N : n > 0) (a : foralli : Fin n, A (ss i)),
cons_dom' A i ss N (head_dom' A n N ss a) (tail_dom' A n ss a) = a i ss: FinSeq n.+1 (Sort σ) N: n.+1 > 0 a: foralli : Fin n.+1, A (ss i)
cons_dom' A (fsucc i) ss N (head_dom' A n.+1 N ss a)
(tail_dom' A n.+1 ss a) = a (fsucc i)
σ: Signature A: Carriers σ n: nat i: Fin n IHi: forall (ss : FinSeq n (Sort σ)) (N : n > 0) (a : foralli : Fin n, A (ss i)),
cons_dom' A i ss N (head_dom' A n N ss a) (tail_dom' A n ss a) = a i ss: FinSeq n.+1 (Sort σ) N: n.+1 > 0 a: foralli : Fin n.+1, A (ss i)
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) ->
(foralli0 : Fin (nat_pred n), A (fstail' n ss i0)) ->
A (ss i))
(fun (n' : nat) (ss : Fin n'.+1 -> Sort σ)
(z : n'.+1 > 0) (x : A (fshead' n'.+1 z ss))
(_ : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => x)
(fun (n' : nat) (i' : Fin n')
(_ : forall (ss : Fin n' -> Sort σ) (N : n' > 0),
A (fshead' n' N ss) ->
(foralli : Fin (nat_pred n'),
A (fstail' n' ss i)) -> A (ss i'))
(ss : Fin n'.+1 -> Sort σ) (N : n'.+1 > 0)
(_ : A (fshead' n'.+1 N ss))
(xs : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => xs i') (fsucc i)
ss N (head_dom' A n.+1 N ss a)
(tail_dom' A n.+1 ss a) = a (fsucc i)
operation_uncurry A ss t o operation_curry A ss t ==
idmap
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n (Sort σ) t: Sort σ a: FiniteOperation A ss t
operation_uncurry A ss t (operation_curry A ss t a) =
a
H: Funext σ: Signature A: Carriers σ ss: FinSeq 0 (Sort σ) t: Sort σ a: FiniteOperation A ss t
operation_uncurry A ss t (operation_curry A ss t a) =
a
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: FiniteOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : FiniteOperation A ss t),
operation_uncurry A ss t (operation_curry A ss t a) = a
operation_uncurry A ss t (operation_curry A ss t a) =
a
H: Funext σ: Signature A: Carriers σ ss: FinSeq 0 (Sort σ) t: Sort σ a: FiniteOperation A ss t
operation_uncurry A ss t (operation_curry A ss t a) =
a
H: Funext σ: Signature A: Carriers σ ss: FinSeq 0 (Sort σ) t: Sort σ a: FiniteOperation A ss t d: foralli : Arity
{|
Arity := Fin 0;
sorts_dom := ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin 0;
sorts_dom := ss;
sort_cod := t
|} i)
operation_uncurry A ss t (operation_curry A ss t a) d =
a d
H: Funext σ: Signature A: Carriers σ ss: FinSeq 0 (Sort σ) t: Sort σ a: FiniteOperation A ss t d: foralli : Arity
{|
Arity := Fin 0;
sorts_dom := ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin 0;
sorts_dom := ss;
sort_cod := t
|} i)
Empty_ind
(fune : Empty =>
A
(sorts_dom
{|
Arity := Fin 0;
sorts_dom := ss;
sort_cod := t
|} e)) = d
apply path_contr.
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: FiniteOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : FiniteOperation A ss t),
operation_uncurry A ss t (operation_curry A ss t a) = a
operation_uncurry A ss t (operation_curry A ss t a) =
a
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: FiniteOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : FiniteOperation A ss t),
operation_uncurry A ss t (operation_curry A ss t a) = a a': foralli : Arity
{|
Arity := Fin n.+1;
sorts_dom := ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n.+1;
sorts_dom := ss;
sort_cod := t
|} i)
operation_uncurry A ss t (operation_curry A ss t a) a' =
a a'
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: FiniteOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : FiniteOperation A ss t),
operation_uncurry A ss t (operation_curry A ss t a) = a a': foralli : Arity
{|
Arity := Fin n.+1;
sorts_dom := ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n.+1;
sorts_dom := ss;
sort_cod := t
|} i)
a
(cons_dom A ss (a' fin_zero)
(funx : Fin n => a' (fsucc x))) = a a'
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: FiniteOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : FiniteOperation A ss t),
operation_uncurry A ss t (operation_curry A ss t a) = a a': foralli : Arity
{|
Arity := Fin n.+1;
sorts_dom := ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n.+1;
sorts_dom := ss;
sort_cod := t
|} i)
cons_dom A ss (a' fin_zero)
(funx : Fin n => a' (fsucc x)) = a'
operation_curry A ss t o operation_uncurry A ss t ==
idmap
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n (Sort σ) t: Sort σ a: CurriedOperation A ss t
operation_curry A ss t (operation_uncurry A ss t a) =
a
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a
operation_curry A ss t (operation_uncurry A ss t a) =
a
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss)
operation_curry A ss t (operation_uncurry A ss t a) x =
a x
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss)
operation_curry A ss t (operation_uncurry A ss t a) x =
operation_curry A (fstail ss) t
(operation_uncurry A (fstail ss) t (a x))
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss)
(funx0 : foralli : Fin n, A (fstail ss i) =>
operation_uncurry A ss t a (cons_dom A ss x x0)) =
operation_uncurry A (fstail ss) t (a x)
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss) a': foralli : Arity
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|} i)
operation_uncurry A ss t a (cons_dom A ss x a') =
operation_uncurry A (fstail ss) t (a x) a'
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss) a': foralli : Arity
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|} i)
operation_uncurry A (fstail ss) t
(a (cons_dom A ss x a' fin_zero))
(funx0 : Fin n => cons_dom A ss x a' (fsucc x0)) =
operation_uncurry A (fstail ss) t (a x) a'
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss) a': foralli : Arity
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|} i)
operation_uncurry A (fstail ss) t
(a
(fin_ind
(fun (n : nat) (i : Fin n) =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) ->
(foralli0 : Fin (nat_pred n),
A (fstail' n ss i0)) -> A (ss i))
(fun (n' : nat) (ss : Fin n'.+1 -> Sort σ)
(z : n'.+1 > 0)
(x : A (fshead' n'.+1 z ss))
(_ : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => x)
(fun (n' : nat) (i' : Fin n')
(_ : forall (ss : Fin n' -> Sort σ)
(N : n' > 0),
A (fshead' n' N ss) ->
(foralli : Fin (nat_pred n'),
A (fstail' n' ss i)) -> A (ss i'))
(ss : Fin n'.+1 -> Sort σ) (N : n'.+1 > 0)
(_ : A (fshead' n'.+1 N ss))
(xs : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => xs i')
fin_zero ss (leq_add_r 1 n) x a'))
(funx0 : Fin n =>
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) ->
(foralli0 : Fin (nat_pred n),
A (fstail' n ss i0)) -> A (ss i))
(fun (n' : nat) (ss : Fin n'.+1 -> Sort σ)
(z : n'.+1 > 0) (x : A (fshead' n'.+1 z ss))
(_ : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => x)
(fun (n' : nat) (i' : Fin n')
(_ : forall (ss : Fin n' -> Sort σ)
(N : n' > 0),
A (fshead' n' N ss) ->
(foralli : Fin (nat_pred n'),
A (fstail' n' ss i)) -> A (ss i'))
(ss : Fin n'.+1 -> Sort σ) (N : n'.+1 > 0)
(_ : A (fshead' n'.+1 N ss))
(xs : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => xs i')
(fsucc x0) ss (leq_add_r 1 n) x a') =
operation_uncurry A (fstail ss) t (a x) a'
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss) a': foralli : Arity
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|} i)
operation_uncurry A (fstail ss) t (a x)
(funx0 : Fin n =>
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) ->
(foralli0 : Fin (nat_pred n),
A (fstail' n ss i0)) -> A (ss i))
(fun (n' : nat) (ss : Fin n'.+1 -> Sort σ)
(z : n'.+1 > 0) (x : A (fshead' n'.+1 z ss))
(_ : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => x)
(fun (n' : nat) (i' : Fin n')
(_ : forall (ss : Fin n' -> Sort σ)
(N : n' > 0),
A (fshead' n' N ss) ->
(foralli : Fin (nat_pred n'),
A (fstail' n' ss i)) -> A (ss i'))
(ss : Fin n'.+1 -> Sort σ) (N : n'.+1 > 0)
(_ : A (fshead' n'.+1 N ss))
(xs : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => xs i')
(fsucc x0) ss (leq_add_r 1 n) x a') =
operation_uncurry A (fstail ss) t (a x) a'
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss) a': foralli : Arity
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|} i)
(funx0 : Fin n =>
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) ->
(foralli0 : Fin (nat_pred n), A (fstail' n ss i0)) ->
A (ss i))
(fun (n' : nat) (ss : Fin n'.+1 -> Sort σ)
(z : n'.+1 > 0) (x : A (fshead' n'.+1 z ss))
(_ : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => x)
(fun (n' : nat) (i' : Fin n')
(_ : forall (ss : Fin n' -> Sort σ)
(N : n' > 0),
A (fshead' n' N ss) ->
(foralli : Fin (nat_pred n'),
A (fstail' n' ss i)) -> A (ss i'))
(ss : Fin n'.+1 -> Sort σ) (N : n'.+1 > 0)
(_ : A (fshead' n'.+1 N ss))
(xs : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => xs i')
(fsucc x0) ss (leq_add_r 1 n) x a') = a'
H: Funext σ: Signature A: Carriers σ n: nat ss: FinSeq n.+1 (Sort σ) t: Sort σ a: CurriedOperation A ss t IHn: forall (ss : FinSeq n (Sort σ)) (a : CurriedOperation A ss t),
operation_curry A ss t (operation_uncurry A ss t a) = a x: A (fshead ss) a': foralli : Arity
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|},
A
(sorts_dom
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|} i) i': Arity
{|
Arity := Fin n;
sorts_dom := fstail ss;
sort_cod := t
|}
fin_ind
(fun (n : nat) (i : Fin n) =>
forall (ss : Fin n -> Sort σ) (N : n > 0),
A (fshead' n N ss) ->
(foralli0 : Fin (nat_pred n), A (fstail' n ss i0)) ->
A (ss i))
(fun (n' : nat) (ss : Fin n'.+1 -> Sort σ)
(z : n'.+1 > 0) (x : A (fshead' n'.+1 z ss))
(_ : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => x)
(fun (n' : nat) (i' : Fin n')
(_ : forall (ss : Fin n' -> Sort σ) (N : n' > 0),
A (fshead' n' N ss) ->
(foralli : Fin (nat_pred n'),
A (fstail' n' ss i)) -> A (ss i'))
(ss : Fin n'.+1 -> Sort σ) (N : n'.+1 > 0)
(_ : A (fshead' n'.+1 N ss))
(xs : foralli : Fin (nat_pred n'.+1),
A (fstail' n'.+1 ss i)) => xs i')
(fsucc i') ss (leq_add_r 1 n) x a' = a' i'
operation_uncurry A ss t o operation_curry A ss t ==
idmap
apply path_operation_curry_to_cunurry.Defined.Definitionequiv_operation_curry `{Funext} {σ} (A : Carriers σ)
{n : nat} (ss : FinSeq n (Sort σ)) (t : Sort σ)
: FiniteOperation A ss t <~> CurriedOperation A ss t
:= Build_Equiv _ _ (operation_curry A ss t) _.