From: Cosimo Oliboni <??> Date: Thu, 4 Feb 2010 03:42:47 +0000 (+0000) Subject: freescale porting X-Git-Tag: make_still_working~3059 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=bd112857523fc543c78cd29b74417585033ec464;p=helm.git freescale porting --- diff --git a/helm/software/matita/contribs/ng_assembly2/common/ascii.ma b/helm/software/matita/contribs/ng_assembly2/common/ascii.ma new file mode 100755 index 000000000..c1f80c50c --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/ascii.ma @@ -0,0 +1,101 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/ascii_base.ma". +include "common/comp.ma". +include "num/bool_lemmas.ma". + +(* ************************** *) +(* DEFINIZIONE ASCII MINIMALE *) +(* ************************** *) + +ndefinition ascii_destruct_aux â +Î c1,c2.Î P:Prop.c1 = c2 â + match eq_ascii c1 c2 with [ true â P â P | false â P ]. + +nlemma ascii_destruct : ascii_destruct_aux. + #c1; #c2; #P; #H; + nrewrite < H; + nelim c1; + nnormalize; + napply (λx.x). +nqed. + +nlemma eq_to_eqascii : ân1,n2.n1 = n2 â eq_ascii n1 n2 = true. + #n1; #n2; #H; + nrewrite > H; + nelim n2; + nnormalize; + napply refl_eq. +nqed. + +nlemma neqascii_to_neq : ân1,n2.eq_ascii n1 n2 = false â n1 â n2. + #n1; #n2; #H; + napply (not_to_not (n1 = n2) (eq_ascii n1 n2 = true) â¦); + ##[ ##1: napply (eq_to_eqascii n1 n2) + ##| ##2: napply (eqfalse_to_neqtrue ⦠H) + ##] +nqed. + +(* !!! per brevita... *) +naxiom eqascii_to_eq : âc1,c2.eq_ascii c1 c2 = true â c1 = c2. + +nlemma neq_to_neqascii : ân1,n2.n1 â n2 â eq_ascii n1 n2 = false. + #n1; #n2; #H; + napply (neqtrue_to_eqfalse (eq_ascii n1 n2)); + napply (not_to_not (eq_ascii n1 n2 = true) (n1 = n2) ? H); + napply (eqascii_to_eq n1 n2). +nqed. + +nlemma decidable_ascii : âx,y:ascii.decidable (x = y). + #x; #y; nnormalize; + napply (or2_elim (eq_ascii x y = true) (eq_ascii x y = false) ? (decidable_bexpr ?)); + ##[ ##1: #H; napply (or2_intro1 (x = y) (x â y) (eqascii_to_eq ⦠H)) + ##| ##2: #H; napply (or2_intro2 (x = y) (x â y) (neqascii_to_neq ⦠H)) + ##] +nqed. + +nlemma symmetric_eqascii : symmetricT ascii bool eq_ascii. + #n1; #n2; + napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_ascii n1 n2)); + ##[ ##1: #H; nrewrite > H; napply refl_eq + ##| ##2: #H; nrewrite > (neq_to_neqascii n1 n2 H); + napply (symmetric_eq ? (eq_ascii n2 n1) false); + napply (neq_to_neqascii n2 n1 (symmetric_neq ? n1 n2 H)) + ##] +nqed. + +nlemma ascii_is_comparable : comparable. + @ ascii + ##[ napply ch_0 + ##| napply forall_ascii + ##| napply eq_ascii + ##| napply eqascii_to_eq + ##| napply eq_to_eqascii + ##| napply neqascii_to_neq + ##| napply neq_to_neqascii + ##| napply decidable_ascii + ##| napply symmetric_eqascii + ##] +nqed. + +unification hint 0 â ⢠carr ascii_is_comparable â¡ ascii. diff --git a/helm/software/matita/contribs/ng_assembly2/common/ascii_base.ma b/helm/software/matita/contribs/ng_assembly2/common/ascii_base.ma new file mode 100755 index 000000000..bf42120d4 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/ascii_base.ma @@ -0,0 +1,147 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/bool.ma". + +(* ************************** *) +(* DEFINIZIONE ASCII MINIMALE *) +(* ************************** *) + +ninductive ascii : Type â +(* numeri *) + ch_0: ascii +| ch_1: ascii +| ch_2: ascii +| ch_3: ascii +| ch_4: ascii +| ch_5: ascii +| ch_6: ascii +| ch_7: ascii +| ch_8: ascii +| ch_9: ascii + +(* simboli *) +| ch__: ascii + +(* maiuscole *) +| ch_A: ascii +| ch_B: ascii +| ch_C: ascii +| ch_D: ascii +| ch_E: ascii +| ch_F: ascii +| ch_G: ascii +| ch_H: ascii +| ch_I: ascii +| ch_J: ascii +| ch_K: ascii +| ch_L: ascii +| ch_M: ascii +| ch_N: ascii +| ch_O: ascii +| ch_P: ascii +| ch_Q: ascii +| ch_R: ascii +| ch_S: ascii +| ch_T: ascii +| ch_U: ascii +| ch_V: ascii +| ch_W: ascii +| ch_X: ascii +| ch_Y: ascii +| ch_Z: ascii + +(* minuscole *) +| ch_a: ascii +| ch_b: ascii +| ch_c: ascii +| ch_d: ascii +| ch_e: ascii +| ch_f: ascii +| ch_g: ascii +| ch_h: ascii +| ch_i: ascii +| ch_j: ascii +| ch_k: ascii +| ch_l: ascii +| ch_m: ascii +| ch_n: ascii +| ch_o: ascii +| ch_p: ascii +| ch_q: ascii +| ch_r: ascii +| ch_s: ascii +| ch_t: ascii +| ch_u: ascii +| ch_v: ascii +| ch_w: ascii +| ch_x: ascii +| ch_y: ascii +| ch_z: ascii. + +(* iteratore sugli ascii *) +ndefinition forall_ascii â λP. + P ch_0 â P ch_1 â P ch_2 â P ch_3 â P ch_4 â P ch_5 â P ch_6 â P ch_7 â + P ch_8 â P ch_9 â P ch__ â P ch_A â P ch_B â P ch_C â P ch_D â P ch_E â + P ch_F â P ch_G â P ch_H â P ch_I â P ch_J â P ch_K â P ch_L â P ch_M â + P ch_N â P ch_O â P ch_P â P ch_Q â P ch_R â P ch_S â P ch_T â P ch_U â + P ch_V â P ch_W â P ch_X â P ch_Y â P ch_Z â P ch_a â P ch_b â P ch_c â + P ch_d â P ch_e â P ch_f â P ch_g â P ch_h â P ch_i â P ch_j â P ch_k â + P ch_l â P ch_m â P ch_n â P ch_o â P ch_p â P ch_q â P ch_r â P ch_s â + P ch_t â P ch_u â P ch_v â P ch_w â P ch_x â P ch_y â P ch_z. + +(* confronto fra ascii *) +ndefinition eq_ascii â +λc,c':ascii.match c with + [ ch_0 â match c' with [ ch_0 â true | _ â false ] | ch_1 â match c' with [ ch_1 â true | _ â false ] + | ch_2 â match c' with [ ch_2 â true | _ â false ] | ch_3 â match c' with [ ch_3 â true | _ â false ] + | ch_4 â match c' with [ ch_4 â true | _ â false ] | ch_5 â match c' with [ ch_5 â true | _ â false ] + | ch_6 â match c' with [ ch_6 â true | _ â false ] | ch_7 â match c' with [ ch_7 â true | _ â false ] + | ch_8 â match c' with [ ch_8 â true | _ â false ] | ch_9 â match c' with [ ch_9 â true | _ â false ] + | ch__ â match c' with [ ch__ â true | _ â false ] | ch_A â match c' with [ ch_A â true | _ â false ] + | ch_B â match c' with [ ch_B â true | _ â false ] | ch_C â match c' with [ ch_C â true | _ â false ] + | ch_D â match c' with [ ch_D â true | _ â false ] | ch_E â match c' with [ ch_E â true | _ â false ] + | ch_F â match c' with [ ch_F â true | _ â false ] | ch_G â match c' with [ ch_G â true | _ â false ] + | ch_H â match c' with [ ch_H â true | _ â false ] | ch_I â match c' with [ ch_I â true | _ â false ] + | ch_J â match c' with [ ch_J â true | _ â false ] | ch_K â match c' with [ ch_K â true | _ â false ] + | ch_L â match c' with [ ch_L â true | _ â false ] | ch_M â match c' with [ ch_M â true | _ â false ] + | ch_N â match c' with [ ch_N â true | _ â false ] | ch_O â match c' with [ ch_O â true | _ â false ] + | ch_P â match c' with [ ch_P â true | _ â false ] | ch_Q â match c' with [ ch_Q â true | _ â false ] + | ch_R â match c' with [ ch_R â true | _ â false ] | ch_S â match c' with [ ch_S â true | _ â false ] + | ch_T â match c' with [ ch_T â true | _ â false ] | ch_U â match c' with [ ch_U â true | _ â false ] + | ch_V â match c' with [ ch_V â true | _ â false ] | ch_W â match c' with [ ch_W â true | _ â false ] + | ch_X â match c' with [ ch_X â true | _ â false ] | ch_Y â match c' with [ ch_Y â true | _ â false ] + | ch_Z â match c' with [ ch_Z â true | _ â false ] | ch_a â match c' with [ ch_a â true | _ â false ] + | ch_b â match c' with [ ch_b â true | _ â false ] | ch_c â match c' with [ ch_c â true | _ â false ] + | ch_d â match c' with [ ch_d â true | _ â false ] | ch_e â match c' with [ ch_e â true | _ â false ] + | ch_f â match c' with [ ch_f â true | _ â false ] | ch_g â match c' with [ ch_g â true | _ â false ] + | ch_h â match c' with [ ch_h â true | _ â false ] | ch_i â match c' with [ ch_i â true | _ â false ] + | ch_j â match c' with [ ch_j â true | _ â false ] | ch_k â match c' with [ ch_k â true | _ â false ] + | ch_l â match c' with [ ch_l â true | _ â false ] | ch_m â match c' with [ ch_m â true | _ â false ] + | ch_n â match c' with [ ch_n â true | _ â false ] | ch_o â match c' with [ ch_o â true | _ â false ] + | ch_p â match c' with [ ch_p â true | _ â false ] | ch_q â match c' with [ ch_q â true | _ â false ] + | ch_r â match c' with [ ch_r â true | _ â false ] | ch_s â match c' with [ ch_s â true | _ â false ] + | ch_t â match c' with [ ch_t â true | _ â false ] | ch_u â match c' with [ ch_u â true | _ â false ] + | ch_v â match c' with [ ch_v â true | _ â false ] | ch_w â match c' with [ ch_w â true | _ â false ] + | ch_x â match c' with [ ch_x â true | _ â false ] | ch_y â match c' with [ ch_y â true | _ â false ] + | ch_z â match c' with [ ch_z â true | _ â false ] + ]. diff --git a/helm/software/matita/contribs/ng_assembly2/common/comp.ma b/helm/software/matita/contribs/ng_assembly2/common/comp.ma new file mode 100755 index 000000000..75300217c --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/comp.ma @@ -0,0 +1,40 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/hints_declaration.ma". +include "num/bool.ma". + +alias symbol "hint_decl" (instance 1) = "hint_decl_Type1". + +nrecord comparable : Type[1] â + { + carr :> Type[0]; + zeroc : carr; + forallc : (carr â bool) â bool; + eqc : carr â carr â bool; + eqc_to_eq : âx,y.(eqc x y = true) â (x = y); + eq_to_eqc : âx,y.(x = y) â (eqc x y = true); + neqc_to_neq : âx,y.(eqc x y = false) â (x â y); + neq_to_neqc : âx,y.(x â y) â (eqc x y = false); + decidable_c : âx,y:carr.decidable (x = y); + symmetric_eqc : symmetricT carr bool eqc + }. diff --git a/helm/software/matita/contribs/ng_assembly2/common/hints_declaration.ma b/helm/software/matita/contribs/ng_assembly2/common/hints_declaration.ma new file mode 100644 index 000000000..354358c0e --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/hints_declaration.ma @@ -0,0 +1,78 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/pts.ma". + +(* + +Notation for hint declaration +============================== + +The idea is to write a context, with abstraction first, then +recursive calls (let-in) and finally the two equivalent terms. +The context can be empty. Note the ; to begin the second part of +the context (necessary even if the first part is empty). + + unification hint PREC \coloneq + ID : TY, ..., ID : TY + ; ID \equest T, ..., ID \equest T + \vdash T1 \equiv T2 + +With unidoce and some ASCII art it looks like the following: + + unification hint PREC â ID : TY, ..., ID : TY; + ID â T, ..., ID â T + (*---------------------*) ⢠+ T1 â¡ T2 + +*) + +(* it seems unbelivable, but it works! *) +notation > "â (list0 ( (list1 (ident x) sep , ) opt (: T) ) sep ,) opt (; (list1 (ident U â term 90 V ) sep ,)) ⢠term 19 Px â¡ term 19 Py" + with precedence 90 + for @{ ${ fold right + @{ ${ default + @{ ${ fold right + @{ 'hint_decl $Px $Py } + rec acc1 @{ let ( ${ident U} : ?) â $V in $acc1} } } + @{ 'hint_decl $Px $Py } + } + } + rec acc @{ + ${ fold right @{ $acc } rec acc2 + @{ â${ident x}:${ default @{ $T } @{ ? } }.$acc2 } } + } + }}. + +ndefinition hint_declaration_Type0 â λA:Type[0].λa,b:A.Prop. +ndefinition hint_declaration_Type1 â λA:Type[1].λa,b:A.Prop. +ndefinition hint_declaration_Type2 â λa,b:Type[2].Prop. +ndefinition hint_declaration_CProp0 â λA:CProp[0].λa,b:A.Prop. +ndefinition hint_declaration_CProp1 â λA:CProp[1].λa,b:A.Prop. +ndefinition hint_declaration_CProp2 â λa,b:CProp[2].Prop. + +interpretation "hint_decl_Type2" 'hint_decl a b = (hint_declaration_Type2 a b). +interpretation "hint_decl_CProp2" 'hint_decl a b = (hint_declaration_CProp2 a b). +interpretation "hint_decl_Type1" 'hint_decl a b = (hint_declaration_Type1 ? a b). +interpretation "hint_decl_CProp1" 'hint_decl a b = (hint_declaration_CProp1 ? a b). +interpretation "hint_decl_CProp0" 'hint_decl a b = (hint_declaration_CProp0 ? a b). +interpretation "hint_decl_Type0" 'hint_decl a b = (hint_declaration_Type0 ? a b). diff --git a/helm/software/matita/contribs/ng_assembly2/common/list.ma b/helm/software/matita/contribs/ng_assembly2/common/list.ma new file mode 100644 index 000000000..a1077f697 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/list.ma @@ -0,0 +1,590 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/comp.ma". +include "common/option.ma". +include "common/nat.ma". + +(* *************** *) +(* LISTE GENERICHE *) +(* *************** *) + +ninductive list (A:Type) : Type â + nil: list A +| cons: A â list A â list A. + +nlet rec append A (l1: list A) l2 on l1 â + match l1 with + [ nil â l2 + | (cons hd tl) â cons A hd (append A tl l2) ]. + +notation "hvbox(hd break :: tl)" + right associative with precedence 47 + for @{'cons $hd $tl}. + +notation "[ list0 x sep ; ]" + non associative with precedence 90 + for ${fold right @'nil rec acc @{'cons $x $acc}}. + +notation "hvbox(l1 break @ l2)" + right associative with precedence 47 + for @{'append $l1 $l2 }. + +interpretation "nil" 'nil = (nil ?). +interpretation "cons" 'cons hd tl = (cons ? hd tl). +interpretation "append" 'append l1 l2 = (append ? l1 l2). + +nlemma list_destruct_1 : âT.âx1,x2:T.ây1,y2:list T.cons T x1 y1 = cons T x2 y2 â x1 = x2. + #T; #x1; #x2; #y1; #y2; #H; + nchange with (match cons T x2 y2 with [ nil â False | cons a _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma list_destruct_2 : âT.âx1,x2:T.ây1,y2:list T.cons T x1 y1 = cons T x2 y2 â y1 = y2. + #T; #x1; #x2; #y1; #y2; #H; + nchange with (match cons T x2 y2 with [ nil â False | cons _ b â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma list_destruct_cons_nil : âT.âx:T.ây:list T.cons T x y = nil T â False. + #T; #x; #y; #H; + nchange with (match cons T x y with [ nil â True | cons a b â False ]); + nrewrite > H; + nnormalize; + napply I. +nqed. + +nlemma list_destruct_nil_cons : âT.âx:T.ây:list T.nil T = cons T x y â False. + #T; #x; #y; #H; + nchange with (match cons T x y with [ nil â True | cons a b â False ]); + nrewrite < H; + nnormalize; + napply I. +nqed. + +nlemma append_nil : âT:Type.âl:list T.(l@[]) = l. + #T; #l; + nelim l; + nnormalize; + ##[ ##1: napply refl_eq + ##| ##2: #x; #y; #H; + nrewrite > H; + napply refl_eq + ##] +nqed. + +nlemma associative_list : âT.associative (list T) (append T). + #T; #x; #y; #z; + nelim x; + nnormalize; + ##[ ##1: napply refl_eq + ##| ##2: #a; #b; #H; + nrewrite > H; + napply refl_eq + ##] +nqed. + +nlemma cons_append_commute : âT:Type.âl1,l2:list T.âa:T.a :: (l1 @ l2) = (a :: l1) @ l2. + #T; #l1; #l2; #a; + nnormalize; + napply refl_eq. +nqed. + +nlemma append_cons_commute : âT:Type.âa:T.âl,l1:list T.l @ (a::l1) = (l@[a]) @ l1. + #T; #a; #l; #l1; + nrewrite > (associative_list T l [a] l1); + nnormalize; + napply refl_eq. +nqed. + +(* listlen *) +nlet rec len_list (T:Type) (l:list T) on l â + match l with [ nil â O | cons _ t â S (len_list T t) ]. + +(* vuota? *) +ndefinition is_empty_list â +λT:Type.λl:list T.match l with [ nil â True | cons _ _ â False ]. + +ndefinition isb_empty_list â +λT:Type.λl:list T.match l with [ nil â true | cons _ _ â false ]. + +ndefinition isnot_empty_list â +λT:Type.λl:list T.match l with [ nil â False | cons _ _ â True ]. + +ndefinition isnotb_empty_list â +λT:Type.λl:list T.match l with [ nil â false | cons _ _ â true ]. + +(* reverse *) +nlet rec reverse_list (T:Type) (l:list T) on l â + match l with + [ nil â nil T + | cons h t â (reverse_list T t)@[h] + ]. + +(* getFirst *) +ndefinition get_first_list â +λT:Type.λl:list T.match l with + [ nil â None ? + | cons h _ â Some ? h ]. + +(* getLast *) +ndefinition get_last_list â +λT:Type.λl:list T.match reverse_list T l with + [ nil â None ? + | cons h _ â Some ? h ]. + +(* cutFirst *) +ndefinition cut_first_list â +λT:Type.λl:list T.match l with + [ nil â nil T + | cons _ t â t ]. + +(* cutLast *) +ndefinition cut_last_list â +λT:Type.λl:list T.match reverse_list T l with + [ nil â nil T + | cons _ t â reverse_list T t ]. + +(* apply f *) +nlet rec apply_f_list (T1,T2:Type) (l:list T1) (f:T1 â T2) on l â +match l with + [ nil â nil T2 + | cons h t â cons T2 (f h) (apply_f_list T1 T2 t f) ]. + +(* fold right *) +nlet rec fold_right_list (T1,T2:Type) (f:T1 â T2 â T2) (acc:T2) (l:list T1) on l â + match l with + [ nil â acc + | cons h t â f h (fold_right_list T1 T2 f acc t) + ]. + +(* double fold right *) +nlemma fold_right_list2_aux1 : +âT.âh,t.len_list T [] = len_list T (h::t) â False. + #T; #h; #t; + nnormalize; + #H; + ndestruct (*napply (nat_destruct_0_S ? H)*). +nqed. + +nlemma fold_right_list2_aux2 : +âT.âh,t.len_list T (h::t) = len_list T [] â False. + #T; #h; #t; + nnormalize; + #H; + ndestruct (*napply (nat_destruct_S_0 ? H)*). +nqed. + +nlemma fold_right_list2_aux3 : +âT.âh,h',t,t'.len_list T (h::t) = len_list T (h'::t') â len_list T t = len_list T t'. + #T; #h; #h'; #t; #t'; + nelim t; + nelim t'; + ##[ ##1: nnormalize; #H; napply refl_eq + ##| ##2: #a; #l'; #H; #H1; + nchange in H1:(%) with ((S O) = (S (S (len_list T l')))); + ndestruct (*nelim (nat_destruct_0_S ? (nat_destruct_S_S ⦠H1))*) + ##| ##3: #a; #l'; #H; #H1; + nchange in H1:(%) with ((S (S (len_list T l'))) = (S O)); + ndestruct (*nelim (nat_destruct_S_0 ? (nat_destruct_S_S ⦠H1))*) + ##| ##4: #a; #l; #H; #a1; #l1; #H1; #H2; + nchange in H2:(%) with ((S (S (len_list T l1))) = (S (S (len_list T l)))); + nchange with ((S (len_list T l1)) = (S (len_list T l))); + nrewrite > (nat_destruct_S_S ⦠H2); + napply refl_eq + ##] +nqed. + +nlet rec fold_right_list2 (T1,T2:Type) (f:T1 â T1 â T2 â T2) (acc:T2) (l1:list T1) on l1 â + match l1 + return λl1.Î l2.len_list T1 l1 = len_list T1 l2 â T2 + with + [ nil â λl2.match l2 return λl2.len_list T1 [] = len_list T1 l2 â T2 with + [ nil â λp:len_list T1 [] = len_list T1 [].acc + | cons h t â λp:len_list T1 [] = len_list T1 (h::t). + False_rect_Type0 ? (fold_right_list2_aux1 T1 h t p) + ] + | cons h t â λl2.match l2 return λl2.len_list T1 (h::t) = len_list T1 l2 â T2 with + [ nil â λp:len_list T1 (h::t) = len_list T1 []. + False_rect_Type0 ? (fold_right_list2_aux2 T1 h t p) + | cons h' t' â λp:len_list T1 (h::t) = len_list T1 (h'::t'). + f h h' (fold_right_list2 T1 T2 f acc t t' (fold_right_list2_aux3 T1 h h' t t' p)) + ] + ]. + +nlet rec bfold_right_list2 (T1:Type) (f:T1 â T1 â bool) (l1,l2:list T1) on l1 â + match l1 with + [ nil â match l2 with + [ nil â true | cons h t â false ] + | cons h t â match l2 with + [ nil â false | cons h' t' â (f h h') â (bfold_right_list2 T1 f t t') + ] + ]. + +(* nth elem *) +nlet rec nth_list (T:Type) (l:list T) (n:nat) on l â + match l with + [ nil â None ? + | cons h t â match n with + [ O â Some ? h | S n' â nth_list T t n' ] + ]. + +(* abs elem *) +ndefinition abs_list_aux1 : âT:Type.ân.((len_list T []) > n) = true â False. + #T; nnormalize; #n; #H; ndestruct (*napply (bool_destruct ⦠H)*). nqed. + +ndefinition abs_list_aux2 : âT:Type.âh:T.ât:list T.ân.((len_list T (h::t)) > (S n) = true) â ((len_list T t) > n) = true. + #T; #h; #t; #n; nnormalize; #H; napply H. nqed. + +nlet rec abs_list (T:Type) (l:list T) on l â + match l + return λl.Î n.(((len_list T l) > n) = true) â T + with + [ nil â λn.λp:(((len_list T []) > n) = true).False_rect_Type0 ? (abs_list_aux1 T n p) + | cons h t â λn. + match n with + [ O â λp:(((len_list T (h::t)) > O) = true).h + | S n' â λp:(((len_list T (h::t)) > (S n')) = true). + abs_list T t n' (abs_list_aux2 T h t n' p) + ] + ]. + +(* esempio: abs_list ? [ 1; 2; 3 ; 4 ] 0 (refl_eq â¦) = 1. *) + +nlemma symmetric_lenlist : âT.âl1,l2:list T.len_list T l1 = len_list T l2 â len_list T l2 = len_list T l1. + #T; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; nnormalize; + ##[ ##1: #H; napply refl_eq + ##| ##2: #h; #t; #H; ndestruct (*nelim (nat_destruct_0_S ? H)*) + ##] + ##| ##2: #h; #l2; ncases l2; nnormalize; + ##[ ##1: #H; #l; #H1; nrewrite < H1; napply refl_eq + ##| ##2: #h; #l; #H; #l3; #H1; nrewrite < H1; napply refl_eq + ##] + ##] +nqed. + +nlemma symmetric_foldrightlist2_aux : +âT1,T2:Type.âf:T1 â T1 â T2 â T2. + (âx,y,z.f x y z = f y x z) â + (âacc:T2.âl1,l2:list T1. + âH1:(len_list T1 l1 = len_list T1 l2). + âH2:(len_list T1 l2 = len_list T1 l1). + (fold_right_list2 T1 T2 f acc l1 l2 H1 = fold_right_list2 T1 T2 f acc l2 l1 H2)). + #T1; #T2; #f; #H; #acc; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: nnormalize; #H1; #H2; napply refl_eq + ##| ##2: #h; #l; #H1; #H2; + nchange in H1:(%) with (O = (S (len_list ? l))); + ndestruct (*nelim (nat_destruct_0_S ? H1)*) + ##] + ##| ##2: #h3; #l3; #H1; #l2; ncases l2; + ##[ ##1: #H2; #H3; nchange in H2:(%) with ((S (len_list ? l3)) = O); + ndestruct (*nelim (nat_destruct_S_0 ? H1)*) + ##| ##2: #h4; #l4; #H2; #H3; + nchange in H2:(%) with ((S (len_list ? l3)) = (S (len_list ? l4))); + nchange in H3:(%) with ((S (len_list ? l4)) = (S (len_list ? l3))); + nchange with ((f h3 h4 (fold_right_list2 T1 T2 f acc l3 l4 (fold_right_list2_aux3 T1 h3 h4 l3 l4 ?))) = + (f h4 h3 (fold_right_list2 T1 T2 f acc l4 l3 (fold_right_list2_aux3 T1 h4 h3 l4 l3 ?)))); + nrewrite < (H1 l4 (fold_right_list2_aux3 T1 h3 h4 l3 l4 H2) (fold_right_list2_aux3 T1 h4 h3 l4 l3 H3)); + nrewrite > (H h3 h4 (fold_right_list2 T1 T2 f acc l3 l4 ?)); + napply refl_eq + ##] + ##] +nqed. + +nlemma symmetric_foldrightlist2 : +âT1,T2:Type.âf:T1 â T1 â T2 â T2. + (âx,y,z.f x y z = f y x z) â + (âacc:T2.âl1,l2:list T1.âH:len_list T1 l1 = len_list T1 l2. + fold_right_list2 T1 T2 f acc l1 l2 H = fold_right_list2 T1 T2 f acc l2 l1 (symmetric_lenlist T1 l1 l2 H)). + #T1; #T2; #f; #H; #acc; #l1; #l2; #H1; + nrewrite > (symmetric_foldrightlist2_aux T1 T2 f H acc l1 l2 H1 (symmetric_lenlist T1 l1 l2 H1)); + napply refl_eq. +nqed. + +nlemma symmetric_bfoldrightlist2 : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.f x y = f y x) â + (âl1,l2:list T1. + bfold_right_list2 T1 f l1 l2 = bfold_right_list2 T1 f l2 l1). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: nnormalize; napply refl_eq + ##| ##2: #hh2; #ll2; nnormalize; napply refl_eq + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: nnormalize; napply refl_eq + ##| ##2: #hh2; #ll2; nnormalize; + nrewrite > (H1 ll2); + nrewrite > (H hh1 hh2); + napply refl_eq + ##] + ##] +nqed. + +nlemma bfoldrightlist2_to_eq : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.(f x y = true â x = y)) â + (âl1,l2:list T1. + (bfold_right_list2 T1 f l1 l2 = true â l1 = l2)). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: #H1; napply refl_eq + ##| ##2: #hh2; #ll2; nnormalize; #H1; + ndestruct (*napply (bool_destruct ⦠H1)*) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: nnormalize; #H2; + ndestruct (*napply (bool_destruct ⦠H2)*) + ##| ##2: #hh2; #ll2; #H2; + nchange in H2:(%) with (((f hh1 hh2)â(bfold_right_list2 T f ll1 ll2)) = true); + nrewrite > (H hh1 hh2 (andb_true_true_l ⦠H2)); + nrewrite > (H1 ll2 (andb_true_true_r ⦠H2)); + napply refl_eq + ##] + ##] +nqed. + +nlemma eq_to_bfoldrightlist2 : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.(x = y â f x y = true)) â + (âl1,l2:list T1. + (l1 = l2 â bfold_right_list2 T1 f l1 l2 = true)). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: #H1; nnormalize; napply refl_eq + ##| ##2: #hh2; #ll2; #H1; + (* !!! ndestruct: assert false *) + nelim (list_destruct_nil_cons ??? H1) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #H2; + (* !!! ndestruct: assert false *) + nelim (list_destruct_cons_nil ??? H2) + ##| ##2: #hh2; #ll2; #H2; nnormalize; + nrewrite > (list_destruct_1 ⦠H2); + nrewrite > (H hh2 hh2 (refl_eq â¦)); + nnormalize; + nrewrite > (H1 ll2 (list_destruct_2 ⦠H2)); + napply refl_eq + ##] + ##] +nqed. + +nlemma bfoldrightlist2_to_lenlist : +âT.âf:T â T â bool. + (âl1,l2:list T.bfold_right_list2 T f l1 l2 = true â len_list T l1 = len_list T l2). + #T; #f; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: nnormalize; #H; napply refl_eq + ##| ##2: nnormalize; #hh; #tt; #H; + ndestruct (*napply (bool_destruct ⦠H)*) + ##] + ##| ##2: #hh; #tt; #H; #l2; ncases l2; + ##[ ##1: nnormalize; #H1; + ndestruct (*napply (bool_destruct ⦠H1)*) + ##| ##2: #hh1; #tt1; #H1; nnormalize; + nrewrite > (H tt1 ?); + ##[ ##1: napply refl_eq + ##| ##2: nchange in H1:(%) with ((? â (bfold_right_list2 T f tt tt1)) = true); + napply (andb_true_true_r ⦠H1) + ##] + ##] + ##] +nqed. + +nlemma decidable_list : +âT.(âx,y:T.decidable (x = y)) â + (âx,y:list T.decidable (x = y)). + #T; #H; #x; nelim x; + ##[ ##1: #y; ncases y; + ##[ ##1: nnormalize; napply (or2_intro1 (? = ?) (? â ?) (refl_eq â¦)) + ##| ##2: #hh2; #tt2; nnormalize; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H1; + (* !!! ndestruct: assert false *) + napply (list_destruct_nil_cons T ⦠H1) + ##] + ##| ##2: #hh1; #tt1; #H1; #y; ncases y; + ##[ ##1: nnormalize; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H2; + (* !!! ndestruct: assert false *) + napply (list_destruct_cons_nil T ⦠H2) + ##| ##2: #hh2; #tt2; nnormalize; napply (or2_elim (hh1 = hh2) (hh1 â hh2) ? (H â¦)); + ##[ ##2: #H2; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H3; napply (H2 (list_destruct_1 T ⦠H3)) + ##| ##1: #H2; napply (or2_elim (tt1 = tt2) (tt1 â tt2) ? (H1 tt2)); + ##[ ##2: #H3; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H4; napply (H3 (list_destruct_2 T ⦠H4)) + ##| ##1: #H3; napply (or2_intro1 (? = ?) (? â ?) ?); + nrewrite > H2; nrewrite > H3; napply refl_eq + ##] + ##] + ##] + ##] +nqed. + +nlemma nbfoldrightlist2_to_neq : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.(f x y = false â x â y)) â + (âl1,l2:list T1. + (bfold_right_list2 T1 f l1 l2 = false â l1 â l2)). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: nnormalize; #H1; + ndestruct (*napply (bool_destruct ⦠H1)*) + ##| ##2: #hh2; #ll2; #H1; nnormalize; #H2; + (* !!! ndestruct: assert false *) + napply (list_destruct_nil_cons T ⦠H2) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #H2; nnormalize; #H3; + (* !!! ndestruct: assert false *) + napply (list_destruct_cons_nil T ⦠H3) + ##| ##2: #hh2; #ll2; #H2; nnormalize; #H3; + nchange in H2:(%) with (((f hh1 hh2)â(bfold_right_list2 T f ll1 ll2)) = false); + napply (H1 ll2 ? (list_destruct_2 T ⦠H3)); + napply (or2_elim ??? (andb_false2 ⦠H2) ); + ##[ ##1: #H4; napply (absurd (hh1 = hh2) â¦); + ##[ ##1: nrewrite > (list_destruct_1 T ⦠H3); napply refl_eq + ##| ##2: napply (H ⦠H4) + ##] + ##| ##2: #H4; napply H4 + ##] + ##] + ##] +nqed. + +nlemma list_destruct : +âT.(âx,y:T.decidable (x = y)) â + (âh1,h2:T.âl1,l2:list T. + (h1::l1) â (h2::l2) â h1 â h2 ⨠l1 â l2). + #T; #H; #h1; #h2; #l1; nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: #H1; napply (or2_intro1 (h1 â h2) ([] â []) â¦); + nnormalize; #H2; nrewrite > H2 in H1:(%); + nnormalize; #H1; napply (H1 (refl_eq â¦)) + ##| ##2: #hh2; #ll2; #H1; napply (or2_intro2 (h1 â h2) ([] â (hh2::ll2)) â¦); + nnormalize; #H2; + (* !!! ndestruct: assert false *) + napply (list_destruct_nil_cons T ⦠H2) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #H2; napply (or2_intro2 (h1 â h2) ((hh1::ll1) â []) â¦); + nnormalize; #H3; + (* !!! ndestruct: assert false *) + napply (list_destruct_cons_nil T ⦠H3) + ##| ##2: #hh2; #ll2; #H2; + napply (or2_elim (h1 = h2) (h1 â h2) ? (H h1 h2) â¦); + ##[ ##2: #H3; napply (or2_intro1 (h1 â h2) ((hh1::ll1) â (hh2::ll2)) H3) + ##| ##1: #H3; napply (or2_intro2 (h1 â h2) ((hh1::ll1) â (hh2::ll2) â¦)); + nrewrite > H3 in H2:(%); #H2; + nnormalize; #H4; nrewrite > (list_destruct_1 T ⦠H4) in H2:(%); #H2; + nrewrite > (list_destruct_2 T ⦠H4) in H2:(%); #H2; + napply (H2 (refl_eq â¦)) + ##] + ##] + ##] +nqed. + +nlemma neq_to_nbfoldrightlist2 : +âT:Type.âf:T â T â bool. + (âx,y:T.decidable (x = y)) â + (âx,y.(x â y â f x y = false)) â + (âl1,l2:list T. + (l1 â l2 â bfold_right_list2 T f l1 l2 = false)). + #T; #f; #H; #H1; #l1; + nelim l1; + ##[ ##1: #l2; ncases l2; + ##[ ##1: nnormalize; #H2; nelim (H2 (refl_eq â¦)) + ##| ##2: #hh2; #ll2; nnormalize; #H2; napply refl_eq + ##] + ##| ##2: #hh1; #ll1; #H2; #l2; ncases l2; + ##[ ##1: nnormalize; #H3; napply refl_eq + ##| ##2: #hh2; #ll2; #H3; + nchange with (((f hh1 hh2)â(bfold_right_list2 T f ll1 ll2)) = false); + napply (or2_elim (hh1 â hh2) (ll1 â ll2) ? (list_destruct T H ⦠H3) â¦); + ##[ ##1: #H4; nrewrite > (H1 hh1 hh2 H4); nnormalize; napply refl_eq + ##| ##2: #H4; nrewrite > (H2 ll2 H4); + nrewrite > (symmetric_andbool (f hh1 hh2) false); + nnormalize; napply refl_eq + ##] + ##] + ##] +nqed. + +nlemma isbemptylist_to_isemptylist : âT,l.isb_empty_list T l = true â is_empty_list T l. + #T; #l; + ncases l; + nnormalize; + ##[ ##1: #H; napply I + ##| ##2: #x; #l; #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma isnotbemptylist_to_isnotemptylist : âT,l.isnotb_empty_list T l = true â isnot_empty_list T l. + #T; #l; + ncases l; + nnormalize; + ##[ ##1: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##| ##2: #x; #l; #H; napply I + ##] +nqed. + +nlemma list_is_comparable : comparable â comparable. + #T; napply (mk_comparable (list T)); + ##[ napply (nil ?) + ##| napply (λx.false) + ##| napply (bfold_right_list2 T (eqc T)) + ##| napply (bfoldrightlist2_to_eq ⦠(eqc T)); + napply (eqc_to_eq T) + ##| napply (eq_to_bfoldrightlist2 ⦠(eqc T)); + napply (eq_to_eqc T) + ##| napply (nbfoldrightlist2_to_neq ⦠(eqc T)); + napply (neqc_to_neq T) + ##| napply (neq_to_nbfoldrightlist2 ⦠(eqc T)); + ##[ napply (decidable_c T) + ##| napply (neq_to_neqc T) + ##] + ##| napply decidable_list; + napply (decidable_c T) + ##| napply symmetric_bfoldrightlist2; + napply (symmetric_eqc T) + ##] +nqed. + +unification hint 0 â S: comparable; + T â (carr S), + X â (list_is_comparable S) + (*********************************************) ⢠+ carr X â¡ list T. diff --git a/helm/software/matita/contribs/ng_assembly2/common/nat.ma b/helm/software/matita/contribs/ng_assembly2/common/nat.ma new file mode 100755 index 000000000..df3a8990a --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/nat.ma @@ -0,0 +1,388 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/comp.ma". +include "num/bool_lemmas.ma". + +(* ******** *) +(* NATURALI *) +(* ******** *) + +ninductive nat : Type â + O : nat +| S : nat â nat. + +(* +interpretation "Natural numbers" 'N = nat. + +default "natural numbers" cic:/matita/common/nat/nat.ind. + +alias num (instance 0) = "natural number". +*) + +nlet rec nat_it (T:Type) (f:T â T) (arg:T) (n:nat) on n â + match n with + [ O â arg + | S n' â nat_it T f (f arg) n' + ]. + +ndefinition nat1 â S O. +ndefinition nat2 â S nat1. +ndefinition nat3 â S nat2. +ndefinition nat4 â S nat3. +ndefinition nat5 â S nat4. +ndefinition nat6 â S nat5. +ndefinition nat7 â S nat6. +ndefinition nat8 â S nat7. +ndefinition nat9 â S nat8. +ndefinition nat10 â S nat9. +ndefinition nat11 â S nat10. +ndefinition nat12 â S nat11. +ndefinition nat13 â S nat12. +ndefinition nat14 â S nat13. +ndefinition nat15 â S nat14. +ndefinition nat16 â S nat15. +ndefinition nat17 â S nat16. +ndefinition nat18 â S nat17. +ndefinition nat19 â S nat18. +ndefinition nat20 â S nat19. +ndefinition nat21 â S nat20. +ndefinition nat22 â S nat21. +ndefinition nat23 â S nat22. +ndefinition nat24 â S nat23. +ndefinition nat25 â S nat24. +ndefinition nat26 â S nat25. +ndefinition nat27 â S nat26. +ndefinition nat28 â S nat27. +ndefinition nat29 â S nat28. +ndefinition nat30 â S nat29. +ndefinition nat31 â S nat30. +ndefinition nat32 â S nat31. +ndefinition nat33 â S nat32. +ndefinition nat34 â S nat33. +ndefinition nat35 â S nat34. +ndefinition nat36 â S nat35. +ndefinition nat37 â S nat36. +ndefinition nat38 â S nat37. +ndefinition nat39 â S nat38. +ndefinition nat40 â S nat39. +ndefinition nat41 â S nat40. +ndefinition nat42 â S nat41. +ndefinition nat43 â S nat42. +ndefinition nat44 â S nat43. +ndefinition nat45 â S nat44. +ndefinition nat46 â S nat45. +ndefinition nat47 â S nat46. +ndefinition nat48 â S nat47. +ndefinition nat49 â S nat48. +ndefinition nat50 â S nat49. +ndefinition nat51 â S nat50. +ndefinition nat52 â S nat51. +ndefinition nat53 â S nat52. +ndefinition nat54 â S nat53. +ndefinition nat55 â S nat54. +ndefinition nat56 â S nat55. +ndefinition nat57 â S nat56. +ndefinition nat58 â S nat57. +ndefinition nat59 â S nat58. +ndefinition nat60 â S nat59. +ndefinition nat61 â S nat60. +ndefinition nat62 â S nat61. +ndefinition nat63 â S nat62. +ndefinition nat64 â S nat63. +ndefinition nat65 â S nat64. +ndefinition nat66 â S nat65. +ndefinition nat67 â S nat66. +ndefinition nat68 â S nat67. +ndefinition nat69 â S nat68. +ndefinition nat70 â S nat69. +ndefinition nat71 â S nat70. +ndefinition nat72 â S nat71. +ndefinition nat73 â S nat72. +ndefinition nat74 â S nat73. +ndefinition nat75 â S nat74. +ndefinition nat76 â S nat75. +ndefinition nat77 â S nat76. +ndefinition nat78 â S nat77. +ndefinition nat79 â S nat78. +ndefinition nat80 â S nat79. +ndefinition nat81 â S nat80. +ndefinition nat82 â S nat81. +ndefinition nat83 â S nat82. +ndefinition nat84 â S nat83. +ndefinition nat85 â S nat84. +ndefinition nat86 â S nat85. +ndefinition nat87 â S nat86. +ndefinition nat88 â S nat87. +ndefinition nat89 â S nat88. +ndefinition nat90 â S nat89. +ndefinition nat91 â S nat90. +ndefinition nat92 â S nat91. +ndefinition nat93 â S nat92. +ndefinition nat94 â S nat93. +ndefinition nat95 â S nat94. +ndefinition nat96 â S nat95. +ndefinition nat97 â S nat96. +ndefinition nat98 â S nat97. +ndefinition nat99 â S nat98. +ndefinition nat100 â S nat99. + +nlet rec eq_nat (n1,n2:nat) on n1 â + match n1 with + [ O â match n2 with [ O â true | S _ â false ] + | S n1' â match n2 with [ O â false | S n2' â eq_nat n1' n2' ] + ]. + +nlet rec le_nat n m â + match n with + [ O â true + | (S p) â match m with + [ O â false | (S q) â le_nat p q ] + ]. + +interpretation "natural 'less or equal to'" 'leq x y = (le_nat x y). + +ndefinition lt_nat â λn1,n2:nat.(le_nat n1 n2) â (â (eq_nat n1 n2)). + +interpretation "natural 'less than'" 'lt x y = (lt_nat x y). + +ndefinition ge_nat â λn1,n2:nat.(â (le_nat n1 n2)) â (eq_nat n1 n2). + +interpretation "natural 'greater or equal to'" 'geq x y = (ge_nat x y). + +ndefinition gt_nat â λn1,n2:nat.â (le_nat n1 n2). + +interpretation "natural 'greater than'" 'gt x y = (gt_nat x y). + +nlet rec plus (n1,n2:nat) on n1 â + match n1 with + [ O â n2 + | (S n1') â S (plus n1' n2) ]. + +interpretation "natural plus" 'plus x y = (plus x y). + +nlet rec times (n1,n2:nat) on n1 â + match n1 with + [ O â O + | (S n1') â n2 + (times n1' n2) ]. + +interpretation "natural times" 'times x y = (times x y). + +nlet rec minus n m â + match n with + [ O â O + | (S p) â + match m with + [O â (S p) + | (S q) â minus p q ]]. + +interpretation "natural minus" 'minus x y = (minus x y). + +nlet rec div_aux p m n : nat â +match (le_nat m n) with +[ true â O +| false â + match p with + [ O â O + | (S q) â S (div_aux q (m-(S n)) n)]]. + +ndefinition div : nat â nat â nat â +λn,m.match m with + [ O â S n + | (S p) â div_aux n n p]. + +interpretation "natural divide" 'divide x y = (div x y). + +ndefinition pred â λn.match n with [ O â O | S n â n ]. + +ndefinition nat128 â nat64 + nat64. +ndefinition nat256 â nat128 + nat128. +ndefinition nat512 â nat256 + nat256. +ndefinition nat1024 â nat512 + nat512. +ndefinition nat2048 â nat1024 + nat1024. +ndefinition nat4096 â nat2048 + nat2048. +ndefinition nat8192 â nat4096 + nat4096. +ndefinition nat16384 â nat8192 + nat8192. +ndefinition nat32768 â nat16384 + nat16384. +ndefinition nat65536 â nat32768 + nat32768. + +nlemma nat_destruct_S_S : ân1,n2:nat.S n1 = S n2 â n1 = n2. + #n1; #n2; #H; + nchange with (match S n2 with [ O â False | S a â n1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma nat_destruct_0_S : ân:nat.O = S n â False. + #n; #H; + nchange with (match S n with [ O â True | S a â False ]); + nrewrite < H; + nnormalize; + napply I. +nqed. + +nlemma nat_destruct_S_0 : ân:nat.S n = O â False. + #n; #H; + nchange with (match S n with [ O â True | S a â False ]); + nrewrite > H; + nnormalize; + napply I. +nqed. + +nlemma eq_to_eqnat : ân1,n2:nat.n1 = n2 â eq_nat n1 n2 = true. + #n1; + nelim n1; + ##[ ##1: #n2; + nelim n2; + nnormalize; + ##[ ##1: #H; napply refl_eq + ##| ##2: #n3; #H; #H1; ndestruct (*nelim (nat_destruct_0_S ? H1)*) + ##] + ##| ##2: #n2; #H; #n3; #H1; + ncases n3 in H1:(%) ⢠%; + nnormalize; + ##[ ##1: #H1; ndestruct (*nelim (nat_destruct_S_0 ? H1)*) + ##| ##2: #n4; #H1; + napply (H n4 (nat_destruct_S_S ⦠H1)) + ##] + ##] +nqed. + +nlemma neqnat_to_neq : ân1,n2:nat.(eq_nat n1 n2 = false â n1 â n2). + #n1; #n2; #H; + napply (not_to_not (n1 = n2) (eq_nat n1 n2 = true) â¦); + ##[ ##1: napply (eq_to_eqnat n1 n2) + ##| ##2: napply (eqfalse_to_neqtrue ⦠H) + ##] +nqed. + +nlemma eqnat_to_eq : ân1,n2:nat.(eq_nat n1 n2 = true â n1 = n2). + #n1; + nelim n1; + ##[ ##1: #n2; + nelim n2; + nnormalize; + ##[ ##1: #H; napply refl_eq + ##| ##2: #n3; #H; #H1; ndestruct (*napply (bool_destruct ⦠(O = S n3) H1)*) + ##] + ##| ##2: #n2; #H; #n3; #H1; + ncases n3 in H1:(%) ⢠%; + nnormalize; + ##[ ##1: #H1; ndestruct (*napply (bool_destruct ⦠(S n2 = O) H1)*) + ##| ##2: #n4; #H1; + nrewrite > (H n4 H1); + napply refl_eq + ##] + ##] +nqed. + +nlemma neq_to_neqnat : ân1,n2:nat.n1 â n2 â eq_nat n1 n2 = false. + #n1; #n2; #H; + napply (neqtrue_to_eqfalse (eq_nat n1 n2)); + napply (not_to_not (eq_nat n1 n2 = true) (n1 = n2) ? H); + napply (eqnat_to_eq n1 n2). +nqed. + +nlemma decidable_nat : âx,y:nat.decidable (x = y). + #x; #y; nnormalize; + napply (or2_elim (eq_nat x y = true) (eq_nat x y = false) ? (decidable_bexpr ?)); + ##[ ##1: #H; napply (or2_intro1 (x = y) (x â y) (eqnat_to_eq ⦠H)) + ##| ##2: #H; napply (or2_intro2 (x = y) (x â y) (neqnat_to_neq ⦠H)) + ##] +nqed. + +nlemma symmetric_eqnat : symmetricT nat bool eq_nat. + #n1; #n2; + napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_nat n1 n2)); + ##[ ##1: #H; nrewrite > H; napply refl_eq + ##| ##2: #H; nrewrite > (neq_to_neqnat n1 n2 H); + napply (symmetric_eq ? (eq_nat n2 n1) false); + napply (neq_to_neqnat n2 n1 (symmetric_neq ? n1 n2 H)) + ##] +nqed. + +nlemma Sn_p_n_to_S_npn : ân1,n2.(S n1) + n2 = S (n1 + n2). + #n1; + nelim n1; + ##[ ##1: nnormalize; #n2; napply refl_eq + ##| ##2: #n; #H; #n2; nrewrite > (H n2); + ncases n in H:(%) ⢠%; + ##[ ##1: nnormalize; #H; napply refl_eq + ##| ##2: #n3; nnormalize; #H; napply refl_eq + ##] + ##] +nqed. + +nlemma n_p_Sn_to_S_npn : ân1,n2.n1 + (S n2) = S (n1 + n2). + #n1; + nelim n1; + ##[ ##1: nnormalize; #n2; napply refl_eq + ##| ##2: #n; #H; #n2; + nrewrite > (Sn_p_n_to_S_npn n (S n2)); + nrewrite > (H n2); + napply refl_eq + ##] +nqed. + +nlemma Opn_to_n : ân.O + n = n. + #n; nnormalize; napply refl_eq. +nqed. + +nlemma npO_to_n : ân.n + O = n. + #n; + nelim n; + ##[ ##1: nnormalize; napply refl_eq + ##| ##2: #n1; #H; + nrewrite > (Sn_p_n_to_S_npn n1 O); + nrewrite > H; + napply refl_eq + ##] +nqed. + +nlemma symmetric_plusnat : symmetricT nat nat plus. + #n1; + nelim n1; + ##[ ##1: #n2; nrewrite > (npO_to_n n2); nnormalize; napply refl_eq + ##| ##2: #n2; #H; #n3; + nrewrite > (Sn_p_n_to_S_npn n2 n3); + nrewrite > (n_p_Sn_to_S_npn n3 n2); + nrewrite > (H n3); + napply refl_eq + ##] +nqed. + +nlemma nat_is_comparable : comparable. + napply (mk_comparable nat); + ##[ napply O + ##| napply (λx.false) + ##| napply eq_nat + ##| napply eqnat_to_eq + ##| napply eq_to_eqnat + ##| napply neqnat_to_neq + ##| napply neq_to_neqnat + ##| napply decidable_nat + ##| napply symmetric_eqnat + ##] +nqed. + +unification hint 0 â ⢠carr nat_is_comparable â¡ nat. diff --git a/helm/software/matita/contribs/ng_assembly2/common/nelist.ma b/helm/software/matita/contribs/ng_assembly2/common/nelist.ma new file mode 100644 index 000000000..4c00777cb --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/nelist.ma @@ -0,0 +1,599 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/list.ma". + +(* ************** *) +(* NON-EMPTY LIST *) +(* ************** *) + +(* lista non vuota *) +ninductive ne_list (A:Type) : Type â + | ne_nil: A â ne_list A + | ne_cons: A â ne_list A â ne_list A. + +(* append *) +nlet rec ne_append (A:Type) (l1,l2:ne_list A) on l1 â + match l1 with + [ ne_nil hd â ne_cons A hd l2 + | ne_cons hd tl â ne_cons A hd (ne_append A tl l2) ]. + +notation "hvbox(hd break §§ tl)" + right associative with precedence 46 + for @{'ne_cons $hd $tl}. + +(* \laquo \raquo *) +notation "« list0 x sep ; break £ y break »" + non associative with precedence 90 + for ${fold right @{'ne_nil $y } rec acc @{'ne_cons $x $acc}}. + +notation "hvbox(l1 break & l2)" + right associative with precedence 47 + for @{'ne_append $l1 $l2 }. + +interpretation "ne_nil" 'ne_nil hd = (ne_nil ? hd). +interpretation "ne_cons" 'ne_cons hd tl = (ne_cons ? hd tl). +interpretation "ne_append" 'ne_append l1 l2 = (ne_append ? l1 l2). + +nlemma nelist_destruct_nil_nil : âT.âx1,x2:T.ne_nil T x1 = ne_nil T x2 â x1 = x2. + #T; #x1; #x2; #H; + nchange with (match ne_nil T x2 with [ ne_cons _ _ â False | ne_nil a â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma nelist_destruct_cons_cons_1 : âT.âx1,x2:T.ây1,y2:ne_list T.ne_cons T x1 y1 = ne_cons T x2 y2 â x1 = x2. + #T; #x1; #x2; #y1; #y2; #H; + nchange with (match ne_cons T x2 y2 with [ ne_nil _ â False | ne_cons a _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma nelist_destruct_cons_cons_2 : âT.âx1,x2:T.ây1,y2:ne_list T.ne_cons T x1 y1 = ne_cons T x2 y2 â y1 = y2. + #T; #x1; #x2; #y1; #y2; #H; + nchange with (match ne_cons T x2 y2 with [ ne_nil _ â False | ne_cons _ b â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma nelist_destruct_cons_nil : âT.âx1,x2:T.ây1:ne_list T.ne_cons T x1 y1 = ne_nil T x2 â False. + #T; #x1; #x2; #y1; #H; + nchange with (match ne_cons T x1 y1 with [ ne_nil _ â True | ne_cons a b â False ]); + nrewrite > H; + nnormalize; + napply I. +nqed. + +nlemma nelist_destruct_nil_cons : âT.âx1,x2:T.ây2:ne_list T.ne_nil T x1 = ne_cons T x2 y2 â False. + #T; #x1; #x2; #y2; #H; + nchange with (match ne_cons T x2 y2 with [ ne_nil _ â True | ne_cons a b â False ]); + nrewrite < H; + nnormalize; + napply I. +nqed. + +nlemma associative_nelist : âT.associative (ne_list T) (ne_append T). + #T; #x; #y; #z; + nelim x; + nnormalize; + ##[ ##1: #hh; napply refl_eq + ##| ##2: #hh; #tt; #H; + nrewrite > H; + napply refl_eq + ##] +nqed. + +nlemma necons_append_commute : âT:Type.âl1,l2:ne_list T.âa:T.(a §§ (l1 & l2)) = ((a §§ l1) & l2). + #T; #l1; #l2; #a; + nnormalize; + napply refl_eq. +nqed. + +nlemma append_necons_commute : âT:Type.âa:T.âl,l1:ne_list T.(l & (a §§ l1)) = (l & «£a») & l1. + #T; #a; #l; #l1; + nrewrite > (associative_nelist T l «£a» l1); + nnormalize; + napply refl_eq. +nqed. + +(* listlen *) +nlet rec len_neList (T:Type) (nl:ne_list T) on nl â + match nl with [ ne_nil _ â (S O) | ne_cons _ t â S (len_neList T t) ]. + +(* reverse *) +nlet rec reverse_neList (T:Type) (nl:ne_list T) on nl â + match nl with + [ ne_nil h â ne_nil T h + | ne_cons h t â (reverse_neList T t)&(ne_nil T h) + ]. + +(* getFirst *) +ndefinition get_first_neList â +λT:Type.λnl:ne_list T.match nl with + [ ne_nil h â h + | ne_cons h _ â h ]. + +(* getLast *) +ndefinition get_last_neList â +λT:Type.λnl:ne_list T.match reverse_neList T nl with + [ ne_nil h â h + | ne_cons h _ â h ]. + +(* cutFirst *) +ndefinition cut_first_neList â +λT:Type.λnl:ne_list T.match nl with + [ ne_nil h â ne_nil T h + | ne_cons _ t â t ]. + +(* cutLast *) +ndefinition cut_last_neList â +λT:Type.λnl:ne_list T.match reverse_neList T nl with + [ ne_nil h â ne_nil T h + | ne_cons _ t â reverse_neList T t ]. + +(* apply f *) +nlet rec apply_f_neList (T1,T2:Type) (nl:ne_list T1) (f:T1 â T2) on nl â +match nl with + [ ne_nil h â ne_nil T2 (f h) + | ne_cons h t â ne_cons T2 (f h) (apply_f_neList T1 T2 t f) ]. + +(* fold right *) +nlet rec fold_right_neList (T1,T2:Type) (f:T1 â T2 â T2) (acc:T2) (nl:ne_list T1) on nl â + match nl with + [ ne_nil h â f h acc + | ne_cons h t â f h (fold_right_neList T1 T2 f acc t) + ]. + +(* double fold right *) +nlemma fold_right_neList2_aux1 : +âT.âh,h',t'.len_neList T «£h» = len_neList T (h'§§t') â False. + #T; #h; #h'; #t'; + nnormalize; + ncases t'; + nnormalize; + ##[ ##1: #x; #H; ndestruct (*nelim (nat_destruct_0_S ? (nat_destruct_S_S ⦠H))*) + ##| ##2: #x; #l; #H; ndestruct (*nelim (nat_destruct_0_S ? (nat_destruct_S_S ⦠H))*) + ##] +nqed. + +nlemma fold_right_neList2_aux2 : +âT.âh,h',t.len_neList T (h§§t) = len_neList T «£h'» â False. + #T; #h; #h'; #t; + nnormalize; + ncases t; + nnormalize; + ##[ ##1: #x; #H; ndestruct (*nelim (nat_destruct_S_0 ? (nat_destruct_S_S ⦠H))*) + ##| ##2: #x; #l; #H; ndestruct (*nelim (nat_destruct_S_0 ? (nat_destruct_S_S ⦠H))*) + ##] +nqed. + +nlemma fold_right_neList2_aux3 : +âT.âh,h',t,t'.len_neList T (h§§t) = len_neList T (h'§§t') â len_neList T t = len_neList T t'. + #T; #h; #h'; #t; #t'; + nelim t; + nelim t'; + ##[ ##1: nnormalize; #x; #y; #H; napply refl_eq + ##| ##2: #a; #l'; #H; #x; #H1; + nchange in H1:(%) with ((S (len_neList T «£x»)) = (S (len_neList T (a§§l')))); + nrewrite > (nat_destruct_S_S ⦠H1); + napply refl_eq + ##| ##3: #x; #a; #l'; #H; #H1; + nchange in H1:(%) with ((S (len_neList T (a§§l')))= (S (len_neList T «£x»))); + nrewrite > (nat_destruct_S_S ⦠H1); + napply refl_eq + ##| ##4: #a; #l; #H; #a1; #l1; #H1; #H2; + nchange in H2:(%) with ((S (len_neList T (a1§§l1))) = (S (len_neList T (a§§l)))); + nrewrite > (nat_destruct_S_S ⦠H2); + napply refl_eq + ##] +nqed. + +nlet rec fold_right_neList2 (T1,T2:Type) (f:T1 â T1 â T2 â T2) (acc:T2) (l1:ne_list T1) on l1 â + match l1 + return λl1.Î l2.len_neList T1 l1 = len_neList T1 l2 â T2 + with + [ ne_nil h â λl2.match l2 return λl2.len_neList T1 «£h» = len_neList T1 l2 â T2 with + [ ne_nil h' â λp:len_neList T1 «£h» = len_neList T1 «£h'». + f h h' acc + | ne_cons h' t' â λp:len_neList T1 «£h» = len_neList T1 (h'§§t'). + False_rect_Type0 ? (fold_right_neList2_aux1 T1 h h' t' p) + ] + | ne_cons h t â λl2.match l2 return λl2.len_neList T1 (h§§t) = len_neList T1 l2 â T2 with + [ ne_nil h' â λp:len_neList T1 (h§§t) = len_neList T1 «£h'». + False_rect_Type0 ? (fold_right_neList2_aux2 T1 h h' t p) + | ne_cons h' t' â λp:len_neList T1 (h§§t) = len_neList T1 (h'§§t'). + f h h' (fold_right_neList2 T1 T2 f acc t t' (fold_right_neList2_aux3 T1 h h' t t' p)) + ] + ]. + +nlet rec bfold_right_neList2 (T1:Type) (f:T1 â T1 â bool) (l1,l2:ne_list T1) on l1 â + match l1 with + [ ne_nil h â match l2 with + [ ne_nil h' â f h h' | ne_cons h' t' â false ] + | ne_cons h t â match l2 with + [ ne_nil h' â false | ne_cons h' t' â (f h h') â (bfold_right_neList2 T1 f t t') + ] + ]. + +(* nth elem *) +nlet rec nth_neList (T:Type) (nl:ne_list T) (n:nat) on nl â + match nl with + [ ne_nil h â match n with + [ O â Some ? h | S _ â None ? ] + | ne_cons h t â match n with + [ O â Some ? h | S n' â nth_neList T t n' ] + ]. + +(* abs elem *) +ndefinition abs_neList_aux1 : âT:Type.âh:T.ân.((len_neList T («£h»)) > (S n)) = true â False. + #T; #h; #n; nnormalize; #H; ndestruct (*napply (bool_destruct ⦠H)*). nqed. + +ndefinition abs_neList_aux2 : âT:Type.âh:T.ât:ne_list T.ân.((len_neList T (h§§t)) > (S n) = true) â ((len_neList T t) > n) = true. + #T; #h; #t; #n; nnormalize; #H; napply H. nqed. + +nlet rec abs_neList (T:Type) (l:ne_list T) on l â + match l + return λl.Î n.(((len_neList T l) > n) = true) â T + with + [ ne_nil h â λn. + match n + return λn.(((len_neList T (ne_nil T h)) > n) = true) â T + with + [ O â λp:(((len_neList T (ne_nil T h)) > O) = true).h + | S n' â λp:(((len_neList T (ne_nil T h)) > (S n')) = true). + False_rect_Type0 ? (abs_neList_aux1 T h n' p) + ] + | ne_cons h t â λn. + match n with + [ O â λp:(((len_neList T (ne_cons T h t)) > O) = true).h + | S n' â λp:(((len_neList T (ne_cons T h t)) > (S n')) = true). + abs_neList T t n' (abs_neList_aux2 T h t n' p) + ] + ]. + +(* esempio: abs_neList ? « 1; 2; 3 £ 4 » 0 (refl_eq â¦) = 1. *) + +(* conversione *) +nlet rec neList_to_list (T:Type) (nl:ne_list T) on nl : list T â + match nl with [ ne_nil h â [h] | ne_cons h t â [h]@(neList_to_list T t) ]. + +nlemma symmetric_lennelist : âT.âl1,l2:ne_list T.len_neList T l1 = len_neList T l2 â len_neList T l2 = len_neList T l1. + #T; #l1; + nelim l1; + ##[ ##1: #h; #l2; ncases l2; nnormalize; + ##[ ##1: #H; #H1; napply refl_eq + ##| ##2: #h; #t; #H; nrewrite > H; napply refl_eq + ##] + ##| ##2: #h; #l2; ncases l2; nnormalize; + ##[ ##1: #h1; #H; #l; #H1; nrewrite < H1; napply refl_eq + ##| ##2: #h; #l; #H; #l3; #H1; nrewrite < H1; napply refl_eq + ##] + ##] +nqed. + +nlemma symmetric_foldrightnelist2_aux : +âT1,T2:Type.âf:T1 â T1 â T2 â T2. + (âx,y,z.f x y z = f y x z) â + (âacc:T2.âl1,l2:ne_list T1. + âH1:len_neList T1 l1 = len_neList T1 l2.âH2:len_neList T1 l2 = len_neList T1 l1. + fold_right_neList2 T1 T2 f acc l1 l2 H1 = fold_right_neList2 T1 T2 f acc l2 l1 H2). + #T1; #T2; #f; #H; #acc; #l1; + nelim l1; + ##[ ##1: #h; #l2; ncases l2; + ##[ ##1: #h1; nnormalize; #H1; #H2; nrewrite > (H h h1 acc); napply refl_eq + ##| ##2: #h1; #l; ncases l; + ##[ ##1: #h3; #H1; #H2; + nchange in H1:(%) with ((S O) = (S (S O))); + (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *) + nelim (nat_destruct_0_S ? (nat_destruct_S_S ⦠H1)) + ##| ##2: #h3; #l3; #H1; #H2; + nchange in H1:(%) with ((S O) = (S (S (len_neList ? l3)))); + (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *) + nelim (nat_destruct_0_S ? (nat_destruct_S_S ⦠H1)) + ##] + ##] + ##| ##2: #h3; #l3; #H1; #l2; ncases l2; + ##[ ##1: #h4; ncases l3; + ##[ ##1: #h5; #H2; #H3; + nchange in H2:(%) with ((S (S O)) = (S O)); + (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *) + nelim (nat_destruct_S_0 ? (nat_destruct_S_S ⦠H2)) + ##| ##2: #h5; #l5; #H2; #H3; + nchange in H2:(%) with ((S (S (len_neList ? l5))) = (S O)); + (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *) + nelim (nat_destruct_S_0 ? (nat_destruct_S_S ⦠H2)) + ##] + ##| ##2: #h4; #l4; #H2; #H3; + nchange in H2:(%) with ((S (len_neList ? l3)) = (S (len_neList ? l4))); + nchange in H3:(%) with ((S (len_neList ? l4)) = (S (len_neList ? l3))); + nchange with ((f h3 h4 (fold_right_neList2 T1 T2 f acc l3 l4 (fold_right_neList2_aux3 T1 h3 h4 l3 l4 ?))) = + (f h4 h3 (fold_right_neList2 T1 T2 f acc l4 l3 (fold_right_neList2_aux3 T1 h4 h3 l4 l3 ?)))); + nrewrite < (H1 l4 (fold_right_neList2_aux3 T1 h3 h4 l3 l4 H2) (fold_right_neList2_aux3 T1 h4 h3 l4 l3 H3)); + nrewrite > (H h3 h4 (fold_right_neList2 T1 T2 f acc l3 l4 ?)); + napply refl_eq + ##] + ##] +nqed. + +nlemma symmetric_foldrightnelist2 : +âT1,T2:Type.âf:T1 â T1 â T2 â T2. + (âx,y,z.f x y z = f y x z) â + (âacc:T2.âl1,l2:ne_list T1.âH:len_neList T1 l1 = len_neList T1 l2. + fold_right_neList2 T1 T2 f acc l1 l2 H = fold_right_neList2 T1 T2 f acc l2 l1 (symmetric_lennelist T1 l1 l2 H)). + #T1; #T2; #f; #H; #acc; #l1; #l2; #H1; + nrewrite > (symmetric_foldrightnelist2_aux T1 T2 f H acc l1 l2 H1 (symmetric_lennelist T1 l1 l2 H1)); + napply refl_eq. +nqed. + +nlemma symmetric_bfoldrightnelist2 : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.f x y = f y x) â + (âl1,l2:ne_list T1. + bfold_right_neList2 T1 f l1 l2 = bfold_right_neList2 T1 f l2 l1). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #hh1; #l2; ncases l2; + ##[ ##1: #hh2; nnormalize; nrewrite > (H hh1 hh2); napply refl_eq + ##| ##2: #hh2; #ll2; nnormalize; napply refl_eq + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #hh2; nnormalize; napply refl_eq + ##| ##2: #hh2; #ll2; nnormalize; + nrewrite > (H1 ll2); + nrewrite > (H hh1 hh2); + napply refl_eq + ##] + ##] +nqed. + +nlemma bfoldrightnelist2_to_eq : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.(f x y = true â x = y)) â + (âl1,l2:ne_list T1. + (bfold_right_neList2 T1 f l1 l2 = true â l1 = l2)). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #hh1; #l2; ncases l2; + ##[ ##1: #hh2; #H1; nnormalize in H1:(%); nrewrite > (H hh1 hh2 H1); napply refl_eq + ##| ##2: #hh2; #ll2; nnormalize; #H1; ndestruct (*napply (bool_destruct ⦠H1)*) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #hh2; nnormalize; #H2; ndestruct (*napply (bool_destruct ⦠H2)*) + ##| ##2: #hh2; #ll2; #H2; + nchange in H2:(%) with (((f hh1 hh2)â(bfold_right_neList2 T f ll1 ll2)) = true); + nrewrite > (H hh1 hh2 (andb_true_true_l ⦠H2)); + nrewrite > (H1 ll2 (andb_true_true_r ⦠H2)); + napply refl_eq + ##] + ##] +nqed. + +nlemma eq_to_bfoldrightnelist2 : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.(x = y â f x y = true)) â + (âl1,l2:ne_list T1. + (l1 = l2 â bfold_right_neList2 T1 f l1 l2 = true)). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #hh1; #l2; ncases l2; + ##[ ##1: #hh2; #H1; nnormalize; + nrewrite > (H hh1 hh2 (nelist_destruct_nil_nil ⦠H1)); + napply refl_eq + ##| ##2: #hh2; #ll2; #H1; + (* !!! ndestruct: assert false *) + nelim (nelist_destruct_nil_cons ???? H1) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #hh2; #H2; + (* !!! ndestruct: assert false *) + nelim (nelist_destruct_cons_nil ???? H2) + ##| ##2: #hh2; #ll2; #H2; nnormalize; + nrewrite > (nelist_destruct_cons_cons_1 ⦠H2); + nrewrite > (H hh2 hh2 (refl_eq â¦)); + nnormalize; + nrewrite > (H1 ll2 (nelist_destruct_cons_cons_2 ⦠H2)); + napply refl_eq + ##] + ##] +nqed. + +nlemma bfoldrightnelist2_to_lennelist : +âT.âf:T â T â bool. + (âl1,l2:ne_list T.bfold_right_neList2 T f l1 l2 = true â len_neList T l1 = len_neList T l2). + #T; #f; #l1; + nelim l1; + ##[ ##1: #hh1; #l2; ncases l2; + ##[ ##1: nnormalize; #hh2; #H; napply refl_eq + ##| ##2: nnormalize; #hh2; #tt2; #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] + ##| ##2: #hh1; #tt1; #H; #l2; ncases l2; + ##[ ##1: nnormalize; #hh2; #H1; ndestruct (*napply (bool_destruct ⦠H1)*) + ##| ##2: #hh2; #tt2; #H1; nnormalize; + nrewrite > (H tt2 ?); + ##[ ##1: napply refl_eq + ##| ##2: nchange in H1:(%) with ((? â (bfold_right_neList2 T f tt1 tt2)) = true); + napply (andb_true_true_r ⦠H1) + ##] + ##] + ##] +nqed. + +nlemma decidable_nelist : +âT.(âx,y:T.decidable (x = y)) â + (âx,y:ne_list T.decidable (x = y)). + #T; #H; #x; nelim x; + ##[ ##1: #hh1; #y; ncases y; + ##[ ##1: #hh2; nnormalize; napply (or2_elim (hh1 = hh2) (hh1 â hh2) ? (H hh1 hh2)); + ##[ ##1: #H1; nrewrite > H1; napply (or2_intro1 (? = ?) (? â ?) (refl_eq â¦)) + ##| ##2: #H1; napply (or2_intro2 (? = ?) (? â ?) ?); nnormalize; + #H2; napply (H1 (nelist_destruct_nil_nil T ⦠H2)) + ##] + ##| ##2: #hh2; #tt2; nnormalize; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H1; + (* !!! ndestruct: assert false *) + napply (nelist_destruct_nil_cons T ⦠H1) + ##] + ##| ##2: #hh1; #tt1; #H1; #y; ncases y; + ##[ ##1: #hh1; nnormalize; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H2; + (* !!! ndestruct: assert false *) + napply (nelist_destruct_cons_nil T ⦠H2) + ##| ##2: #hh2; #tt2; nnormalize; napply (or2_elim (hh1 = hh2) (hh1 â hh2) ? (H â¦)); + ##[ ##2: #H2; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H3; napply (H2 (nelist_destruct_cons_cons_1 T ⦠H3)) + ##| ##1: #H2; napply (or2_elim (tt1 = tt2) (tt1 â tt2) ? (H1 tt2)); + ##[ ##2: #H3; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H4; napply (H3 (nelist_destruct_cons_cons_2 T ⦠H4)) + ##| ##1: #H3; napply (or2_intro1 (? = ?) (? â ?) ?); + nrewrite > H2; nrewrite > H3; napply refl_eq + ##] + ##] + ##] + ##] +nqed. + +nlemma nbfoldrightnelist2_to_neq : +âT1:Type.âf:T1 â T1 â bool. + (âx,y.(f x y = false â x â y)) â + (âl1,l2:ne_list T1. + (bfold_right_neList2 T1 f l1 l2 = false â l1 â l2)). + #T; #f; #H; #l1; + nelim l1; + ##[ ##1: #hh1; #l2; ncases l2; + ##[ ##1: #hh2; nnormalize; #H1; #H2; napply (H hh1 hh2 H1 (nelist_destruct_nil_nil T ⦠H2)) + ##| ##2: #hh2; #ll2; #H1; nnormalize; #H2; + (* !!! ndestruct: assert false *) + napply (nelist_destruct_nil_cons T ⦠H2) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #hh2; #H2; nnormalize; #H3; + (* !!! ndestruct: assert false *) + napply (nelist_destruct_cons_nil T ⦠H3) + ##| ##2: #hh2; #ll2; #H2; nnormalize; #H3; + nchange in H2:(%) with (((f hh1 hh2)â(bfold_right_neList2 T f ll1 ll2)) = false); + napply (H1 ll2 ? (nelist_destruct_cons_cons_2 T ⦠H3)); + napply (or2_elim ??? (andb_false2 ⦠H2) ); + ##[ ##1: #H4; napply (absurd (hh1 = hh2) â¦); + ##[ ##1: nrewrite > (nelist_destruct_cons_cons_1 T ⦠H3); napply refl_eq + ##| ##2: napply (H ⦠H4) + ##] + ##| ##2: #H4; napply H4 + ##] + ##] + ##] +nqed. + +nlemma nelist_destruct : +âT.(âx,y:T.decidable (x = y)) â + (âh1,h2:T.âl1,l2:ne_list T. + (h1§§l1) â (h2§§l2) â h1 â h2 ⨠l1 â l2). + #T; #H; #h1; #h2; #l1; nelim l1; + ##[ ##1: #hh1; #l2; ncases l2; + ##[ ##1: #hh2; #H1; napply (or2_elim (h1 = h2) (h1 â h2) ? (H â¦) â¦); + ##[ ##2: #H2; napply (or2_intro1 (h1 â h2) («£hh1» â «£hh2») H2) + ##| ##1: #H2; nrewrite > H2 in H1:(%); #H1; + napply (or2_elim (hh1 = hh2) (hh1 â hh2) ? (H â¦) â¦); + ##[ ##2: #H3; napply (or2_intro2 (h2 â h2) («£hh1» â «£hh2») ?); + nnormalize; #H4; napply (H3 (nelist_destruct_nil_nil T ⦠H4)) + ##| ##1: #H3; nrewrite > H3 in H1:(%); #H1; nelim (H1 (refl_eq â¦)) + ##] + ##] + ##| ##2: #hh2; #ll2; #H1; napply (or2_intro2 (h1 â h2) («£hh1» â (hh2§§ll2)) â¦); + nnormalize; #H2; + (* !!! ndestruct: assert false *) + napply (nelist_destruct_nil_cons T ⦠H2) + ##] + ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2; + ##[ ##1: #hh2; #H2; napply (or2_intro2 (h1 â h2) ((hh1§§ll1) â «£hh2») â¦); + nnormalize; #H3; + (* !!! ndestruct: assert false *) + napply (nelist_destruct_cons_nil T ⦠H3) + ##| ##2: #hh2; #ll2; #H2; + napply (or2_elim (h1 = h2) (h1 â h2) ? (H h1 h2) â¦); + ##[ ##2: #H3; napply (or2_intro1 (h1 â h2) ((hh1§§ll1) â (hh2§§ll2)) H3) + ##| ##1: #H3; napply (or2_intro2 (h1 â h2) ((hh1§§ll1) â (hh2§§ll2) â¦)); + nrewrite > H3 in H2:(%); #H2; + nnormalize; #H4; nrewrite > (nelist_destruct_cons_cons_1 T ⦠H4) in H2:(%); #H2; + nrewrite > (nelist_destruct_cons_cons_2 T ⦠H4) in H2:(%); #H2; + napply (H2 (refl_eq â¦)) + ##] + ##] + ##] +nqed. + +nlemma neq_to_nbfoldrightnelist2 : +âT:Type.âf:T â T â bool. + (âx,y:T.decidable (x = y)) â + (âx,y.(x â y â f x y = false)) â + (âl1,l2:ne_list T. + (l1 â l2 â bfold_right_neList2 T f l1 l2 = false)). + #T; #f; #H; #H1; #l1; + nelim l1; + ##[ ##1: #hh1; #l2; ncases l2; + ##[ ##1: #hh2; nnormalize; #H2; napply (H1 hh1 hh2 ?); + nnormalize; #H3; nrewrite > H3 in H2:(%); #H2; napply (H2 (refl_eq â¦)) + ##| ##2: #hh2; #ll2; nnormalize; #H2; napply refl_eq + ##] + ##| ##2: #hh1; #ll1; #H2; #l2; ncases l2; + ##[ ##1: #hh2; nnormalize; #H3; napply refl_eq + ##| ##2: #hh2; #ll2; #H3; + nchange with (((f hh1 hh2)â(bfold_right_neList2 T f ll1 ll2)) = false); + napply (or2_elim (hh1 â hh2) (ll1 â ll2) ? (nelist_destruct T H ⦠H3) â¦); + ##[ ##1: #H4; nrewrite > (H1 hh1 hh2 H4); nnormalize; napply refl_eq + ##| ##2: #H4; nrewrite > (H2 ll2 H4); + nrewrite > (symmetric_andbool (f hh1 hh2) false); + nnormalize; napply refl_eq + ##] + ##] + ##] +nqed. + +nlemma nelist_is_comparable : comparable â comparable. + #T; napply (mk_comparable (ne_list T)); + ##[ napply (ne_nil ? (zeroc T)) + ##| napply (λx.false) + ##| napply (bfold_right_neList2 T (eqc T)) + ##| napply (bfoldrightnelist2_to_eq ⦠(eqc T)); + napply (eqc_to_eq T) + ##| napply (eq_to_bfoldrightnelist2 ⦠(eqc T)); + napply (eq_to_eqc T) + ##| napply (nbfoldrightnelist2_to_neq ⦠(eqc T)); + napply (neqc_to_neq T) + ##| napply (neq_to_nbfoldrightnelist2 ⦠(eqc T)); + ##[ napply (decidable_c T) + ##| napply (neq_to_neqc T) + ##] + ##| napply decidable_nelist; + napply (decidable_c T) + ##| napply symmetric_bfoldrightnelist2; + napply (symmetric_eqc T) + ##] +nqed. + +unification hint 0 â S: comparable; + T â (carr S), + X â (nelist_is_comparable S) + (*********************************************) ⢠+ carr X â¡ ne_list T. diff --git a/helm/software/matita/contribs/ng_assembly2/common/option.ma b/helm/software/matita/contribs/ng_assembly2/common/option.ma new file mode 100644 index 000000000..51fc5ce13 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/option.ma @@ -0,0 +1,202 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/comp.ma". +include "common/option_base.ma". +include "num/bool_lemmas.ma". + +(* ****** *) +(* OPTION *) +(* ****** *) + +nlemma option_destruct_some_some : âT.âx1,x2:T.Some T x1 = Some T x2 â x1 = x2. + #T; #x1; #x2; #H; + nchange with (match Some T x2 with [ None â False | Some a â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma option_destruct_some_none : âT.âx:T.Some T x = None T â False. + #T; #x; #H; + nchange with (match Some T x with [ None â True | Some a â False ]); + nrewrite > H; + nnormalize; + napply I. +nqed. + +nlemma option_destruct_none_some : âT.âx:T.None T = Some T x â False. + #T; #x; #H; + nchange with (match Some T x with [ None â True | Some a â False ]); + nrewrite < H; + nnormalize; + napply I. +nqed. + +nlemma symmetric_eqoption : +âT:Type.âf:T â T â bool. + (symmetricT T bool f) â + (âop1,op2:option T. + (eq_option T f op1 op2 = eq_option T f op2 op1)). + #T; #f; #H; + #op1; #op2; nelim op1; nelim op2; + nnormalize; + ##[ ##1: napply refl_eq + ##| ##2,3: #H; napply refl_eq + ##| ##4: #a; #a0; + nrewrite > (H a0 a); + napply refl_eq + ##] +nqed. + +nlemma eq_to_eqoption : +âT.âf:T â T â bool. + (âx1,x2:T.x1 = x2 â f x1 x2 = true) â + (âop1,op2:option T. + (op1 = op2 â eq_option T f op1 op2 = true)). + #T; #f; #H; + #op1; #op2; nelim op1; nelim op2; + nnormalize; + ##[ ##1: #H1; napply refl_eq + ##| ##2: #a; #H1; + (* !!! ndestruct: assert false *) + nelim (option_destruct_none_some ?? H1) + ##| ##3: #a; #H1; + (* !!! ndestruct: assert false *) + nelim (option_destruct_some_none ?? H1) + ##| ##4: #a; #a0; #H1; + nrewrite > (H ⦠(option_destruct_some_some ⦠H1)); + napply refl_eq + ##] +nqed. + +nlemma eqoption_to_eq : +âT.âf:T â T â bool. + (âx1,x2:T.f x1 x2 = true â x1 = x2) â + (âop1,op2:option T. + (eq_option T f op1 op2 = true â op1 = op2)). + #T; #f; #H; + #op1; #op2; nelim op1; nelim op2; + nnormalize; + ##[ ##1: #H1; napply refl_eq + ##| ##2,3: #a; #H1; ndestruct (*napply (bool_destruct ⦠H1)*) + ##| ##4: #a; #a0; #H1; + nrewrite > (H ⦠H1); + napply refl_eq + ##] +nqed. + +nlemma decidable_option : +âT.(Î x,y:T.decidable (x = y)) â + (âx,y:option T.decidable (x = y)). + #T; #H; #x; nelim x; + ##[ ##1: #y; ncases y; + ##[ ##1: nnormalize; napply (or2_intro1 (? = ?) (? â ?) (refl_eq â¦)) + ##| ##2: #yy; nnormalize; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H1; + (* !!! ndestruct: assert false *) + napply (option_destruct_none_some T ⦠H1) + ##] + ##| ##2: #xx; #y; ncases y; + ##[ ##1: nnormalize; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H2; + (* !!! ndestruct: assert false *) + napply (option_destruct_some_none T ⦠H2) + ##| ##2: #yy; nnormalize; napply (or2_elim (xx = yy) (xx â yy) ? (H â¦)); + ##[ ##2: #H1; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H2; + napply (H1 (option_destruct_some_some T ⦠H2)) + ##| ##1: #H1; napply (or2_intro1 (? = ?) (? â ?) ?); + nrewrite > H1; napply refl_eq + ##] + ##] + ##] +nqed. + +nlemma neq_to_neqoption : +âT.âf:T â T â bool. + (âx1,x2:T.x1 â x2 â f x1 x2 = false) â + (âop1,op2:option T. + (op1 â op2 â eq_option T f op1 op2 = false)). + #T; #f; #H; #op1; nelim op1; + ##[ ##1: #op2; ncases op2; + ##[ ##1: nnormalize; #H1; nelim (H1 (refl_eq â¦)) + ##| ##2: #yy; nnormalize; #H1; napply refl_eq + ##] + ##| ##2: #xx; #op2; ncases op2; + ##[ ##1: nnormalize; #H1; napply refl_eq + ##| ##2: #yy; nnormalize; #H1; napply (H xx yy â¦); + nnormalize; #H2; nrewrite > H2 in H1:(%); #H1; + napply (H1 (refl_eq â¦)) + ##] + ##] +nqed. + +nlemma neqoption_to_neq : +âT.âf:T â T â bool. + (âx1,x2:T.f x1 x2 = false â x1 â x2) â + (âop1,op2:option T. + (eq_option T f op1 op2 = false â op1 â op2)). + #T; #f; #H; #op1; nelim op1; + ##[ ##1: #op2; ncases op2; + ##[ ##1: nnormalize; #H1; + ndestruct (*napply (bool_destruct ⦠H1)*) + ##| ##2: #yy; nnormalize; #H1; #H2; + (* !!! ndestruct: assert false *) + napply (option_destruct_none_some T ⦠H2) + ##] + ##| ##2: #xx; #op2; ncases op2; + ##[ ##1: nnormalize; #H1; #H2; + (* !!! ndestruct: assert false *) + napply (option_destruct_some_none T ⦠H2) + ##| ##2: #yy; nnormalize; #H1; #H2; napply (H xx yy H1 ?); + napply (option_destruct_some_some T ⦠H2) + ##] + ##] +nqed. + +nlemma option_is_comparable : + comparable â comparable. + #T; napply (mk_comparable (option T)); + ##[ napply (None ?) + ##| napply (λx.false) + ##| napply (eq_option ⦠(eqc T)) + ##| napply (eqoption_to_eq ⦠(eqc T)); + napply (eqc_to_eq T) + ##| napply (eq_to_eqoption ⦠(eqc T)); + napply (eq_to_eqc T) + ##| napply (neqoption_to_neq ⦠(eqc T)); + napply (neqc_to_neq T) + ##| napply (neq_to_neqoption ⦠(eqc T)); + napply (neq_to_neqc T) + ##| napply decidable_option; + napply (decidable_c T) + ##| napply symmetric_eqoption; + napply (symmetric_eqc T) + ##] +nqed. + +unification hint 0 â S: comparable; + T â (carr S), + X â (option_is_comparable S) + (*********************************************) ⢠+ carr X â¡ option T. diff --git a/helm/software/matita/contribs/ng_assembly2/common/option_base.ma b/helm/software/matita/contribs/ng_assembly2/common/option_base.ma new file mode 100644 index 000000000..62da65900 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/option_base.ma @@ -0,0 +1,43 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/bool.ma". + +(* ****** *) +(* OPTION *) +(* ****** *) + +ninductive option (A:Type) : Type â + None : option A +| Some : A â option A. + +ndefinition eq_option â +λT.λf:T â T â bool.λop1,op2:option T. + match op1 with + [ None â match op2 with [ None â true | Some _ â false ] + | Some x1 â match op2 with [ None â false | Some x2 â f x1 x2 ] + ]. + +(* option map = match ... with [ None â None ? | Some .. â .. ] *) +ndefinition opt_map â +λT1,T2:Type.λt:option T1.λf:T1 â option T2. + match t with [ None â None ? | Some x â (f x) ]. diff --git a/helm/software/matita/contribs/ng_assembly2/common/prod.ma b/helm/software/matita/contribs/ng_assembly2/common/prod.ma new file mode 100644 index 000000000..38852d1a9 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/prod.ma @@ -0,0 +1,1118 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/comp.ma". +include "common/prod_base.ma". +include "num/bool_lemmas.ma". + +(* ********* *) +(* TUPLE x 2 *) +(* ********* *) + +nlemma pair_destruct_1 : +âT1,T2.âx1,x2:T1.ây1,y2:T2. + pair T1 T2 x1 y1 = pair T1 T2 x2 y2 â x1 = x2. + #T1; #T2; #x1; #x2; #y1; #y2; #H; + nchange with (match pair T1 T2 x2 y2 with [ pair a _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma pair_destruct_2 : +âT1,T2.âx1,x2:T1.ây1,y2:T2. + pair T1 T2 x1 y1 = pair T1 T2 x2 y2 â y1 = y2. + #T1; #T2; #x1; #x2; #y1; #y2; #H; + nchange with (match pair T1 T2 x2 y2 with [ pair _ b â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_eqpair : +âT1,T2:Type. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool. + (symmetricT T1 bool f1) â + (symmetricT T2 bool f2) â + (âp1,p2:ProdT T1 T2. + (eq_pair T1 T2 f1 f2 p1 p2 = eq_pair T1 T2 f1 f2 p2 p1)). + #T1; #T2; #f1; #f2; #H; #H1; + #p1; nelim p1; #x1; #y1; + #p2; nelim p2; #x2; #y2; + nnormalize; + nrewrite > (H x1 x2); + ncases (f1 x2 x1); + nnormalize; + ##[ ##1: nrewrite > (H1 y1 y2); napply refl_eq + ##| ##2: napply refl_eq + ##] +nqed. + +nlemma eq_to_eqpair : +âT1,T2. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool. + (âx,y:T1.x = y â f1 x y = true) â + (âx,y:T2.x = y â f2 x y = true) â + (âp1,p2:ProdT T1 T2. + (p1 = p2 â eq_pair T1 T2 f1 f2 p1 p2 = true)). + #T1; #T2; #f1; #f2; #H1; #H2; + #p1; nelim p1; #x1; #y1; + #p2; nelim p2; #x2; #y2; #H; + nnormalize; + nrewrite > (H1 ⦠(pair_destruct_1 ⦠H)); + nnormalize; + nrewrite > (H2 ⦠(pair_destruct_2 ⦠H)); + napply refl_eq. +nqed. + +nlemma eqpair_to_eq : +âT1,T2. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool. + (âx,y:T1.f1 x y = true â x = y) â + (âx,y:T2.f2 x y = true â x = y) â + (âp1,p2:ProdT T1 T2. + (eq_pair T1 T2 f1 f2 p1 p2 = true â p1 = p2)). + #T1; #T2; #f1; #f2; #H1; #H2; + #p1; nelim p1; #x1; #y1; + #p2; nelim p2; #x2; #y2; #H; + nnormalize in H:(%); + nletin K â (H1 x1 x2); + ncases (f1 x1 x2) in H:(%) K:(%); + nnormalize; + #H3; + ##[ ##2: ndestruct (*napply (bool_destruct ⦠H3)*) ##] + #H4; + nrewrite > (H4 (refl_eq â¦)); + nrewrite > (H2 y1 y2 H3); + napply refl_eq. +nqed. + +nlemma decidable_pair : +âT1,T2. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:ProdT T1 T2.decidable (x = y)). + #T1; #T2; #H; #H1; + #x; nelim x; #xx1; #xx2; + #y; nelim y; #yy1; #yy2; + nnormalize; + napply (or2_elim (xx1 = yy1) (xx1 â yy1) ? (H xx1 yy1) ?); + ##[ ##2: #H2; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H3; napply (H2 (pair_destruct_1 T1 T2 ⦠H3)) + ##| ##1: #H2; napply (or2_elim (xx2 = yy2) (xx2 â yy2) ? (H1 xx2 yy2) ?); + ##[ ##2: #H3; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H4; napply (H3 (pair_destruct_2 T1 T2 ⦠H4)) + ##| ##1: #H3; napply (or2_intro1 (? = ?) (? â ?) ?); + nrewrite > H2; nrewrite > H3; napply refl_eq + ##] + ##] +nqed. + +nlemma neqpair_to_neq : +âT1,T2. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool. + (âx,y:T1.f1 x y = false â x â y) â + (âx,y:T2.f2 x y = false â x â y) â + (âp1,p2:ProdT T1 T2. + (eq_pair T1 T2 f1 f2 p1 p2 = false â p1 â p2)). + #T1; #T2; #f1; #f2; #H1; #H2; + #p1; nelim p1; #x1; #y1; + #p2; nelim p2; #x2; #y2; + nchange with ((((f1 x1 x2) â (f2 y1 y2)) = false) â ?); #H; + nnormalize; #H3; + napply (or2_elim ((f1 x1 x2) = false) ((f2 y1 y2) = false) ? (andb_false2 ⦠H) ?); + ##[ ##1: #H4; napply (H1 x1 x2 H4); napply (pair_destruct_1 T1 T2 ⦠H3) + ##| ##2: #H4; napply (H2 y1 y2 H4); napply (pair_destruct_2 T1 T2 ⦠H3) + ##] +nqed. + +nlemma pair_destruct : +âT1,T2. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx1,x2:T1.ây1,y2:T2. + (pair T1 T2 x1 y1) â (pair T1 T2 x2 y2) â x1 â x2 ⨠y1 â y2). + #T1; #T2; #H1; #H2; #x1; #x2; #y1; #y2; + nnormalize; #H; + napply (or2_elim (x1 = x2) (x1 â x2) ? (H1 x1 x2) ?); + ##[ ##2: #H3; napply (or2_intro1 ⦠H3) + ##| ##1: #H3; napply (or2_elim (y1 = y2) (y1 â y2) ? (H2 y1 y2) ?); + ##[ ##2: #H4; napply (or2_intro2 ⦠H4) + ##| ##1: #H4; nrewrite > H3 in H:(%); + nrewrite > H4; #H; nelim (H (refl_eq â¦)) + ##] + ##] +nqed. + +nlemma neq_to_neqpair : +âT1,T2. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T1.x â y â f1 x y = false) â + (âx,y:T2.x â y â f2 x y = false) â + (âp1,p2:ProdT T1 T2. + (p1 â p2 â eq_pair T1 T2 f1 f2 p1 p2 = false)). + #T1; #T2; #f1; #f2; #H1; #H2; #H3; #H4; + #p1; nelim p1; #x1; #y1; + #p2; nelim p2; #x2; #y2; #H; + nchange with (((f1 x1 x2) â (f2 y1 y2)) = false); + napply (or2_elim (x1 â x2) (y1 â y2) ? (pair_destruct T1 T2 H1 H2 ⦠H) ?); + ##[ ##2: #H5; nrewrite > (H4 ⦠H5); nrewrite > (andb_false2_2 (f1 x1 x2)); napply refl_eq + ##| ##1: #H5; nrewrite > (H3 ⦠H5); nnormalize; napply refl_eq + ##] +nqed. + +nlemma pair_is_comparable : + comparable â comparable â comparable. + #T1; #T2; napply (mk_comparable (ProdT T1 T2)); + ##[ napply (pair ⦠(zeroc T1) (zeroc T2)) + ##| napply (λx.false) + ##| napply (eq_pair ⦠(eqc T1) (eqc T2)) + ##| napply (eqpair_to_eq ⦠(eqc T1) (eqc T2)); + ##[ napply (eqc_to_eq T1) + ##| napply (eqc_to_eq T2) + ##] + ##| napply (eq_to_eqpair ⦠(eqc T1) (eqc T2)); + ##[ napply (eq_to_eqc T1) + ##| napply (eq_to_eqc T2) + ##] + ##| napply (neqpair_to_neq ⦠(eqc T1) (eqc T2)); + ##[ napply (neqc_to_neq T1) + ##| napply (neqc_to_neq T2) + ##] + ##| napply (neq_to_neqpair ⦠(eqc T1) (eqc T2)); + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##| napply (neq_to_neqc T1) + ##| napply (neq_to_neqc T2) + ##] + ##| napply decidable_pair; + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##] + ##| napply symmetric_eqpair; + ##[ napply (symmetric_eqc T1) + ##| napply (symmetric_eqc T2) + ##] + ##] +nqed. + +unification hint 0 â S1: comparable, S2: comparable; + T1 â (carr S1), T2 â (carr S2), + X â (pair_is_comparable S1 S2) + (*********************************************) ⢠+ carr X â¡ ProdT T1 T2. + +(* ********* *) +(* TUPLE x 3 *) +(* ********* *) + +nlemma triple_destruct_1 : +âT1,T2,T3.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3. + triple T1 T2 T3 x1 y1 z1 = triple T1 T2 T3 x2 y2 z2 â x1 = x2. + #T1; #T2; #T3; #x1; #x2; #y1; #y2; #z1; #z2; #H; + nchange with (match triple T1 T2 T3 x2 y2 z2 with [ triple a _ _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma triple_destruct_2 : +âT1,T2,T3.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3. + triple T1 T2 T3 x1 y1 z1 = triple T1 T2 T3 x2 y2 z2 â y1 = y2. + #T1; #T2; #T3; #x1; #x2; #y1; #y2; #z1; #z2; #H; + nchange with (match triple T1 T2 T3 x2 y2 z2 with [ triple _ b _ â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma triple_destruct_3 : +âT1,T2,T3.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3. + triple T1 T2 T3 x1 y1 z1 = triple T1 T2 T3 x2 y2 z2 â z1 = z2. + #T1; #T2; #T3; #x1; #x2; #y1; #y2; #z1; #z2; #H; + nchange with (match triple T1 T2 T3 x2 y2 z2 with [ triple _ _ c â z1 = c ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_eqtriple : +âT1,T2,T3:Type. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool. + (symmetricT T1 bool f1) â + (symmetricT T2 bool f2) â + (symmetricT T3 bool f3) â + (âp1,p2:Prod3T T1 T2 T3. + (eq_triple T1 T2 T3 f1 f2 f3 p1 p2 = eq_triple T1 T2 T3 f1 f2 f3 p2 p1)). + #T1; #T2; #T3; #f1; #f2; #f3; #H; #H1; #H2; + #p1; nelim p1; #x1; #y1; #z1; + #p2; nelim p2; #x2; #y2; #z2; + nnormalize; + nrewrite > (H x1 x2); + ncases (f1 x2 x1); + nnormalize; + ##[ ##1: nrewrite > (H1 y1 y2); + ncases (f2 y2 y1); + nnormalize; + ##[ ##1: nrewrite > (H2 z1 z2); napply refl_eq + ##| ##2: napply refl_eq + ##] + ##| ##2: napply refl_eq + ##] +nqed. + +nlemma eq_to_eqtriple : +âT1,T2,T3. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool. + (âx1,x2:T1.x1 = x2 â f1 x1 x2 = true) â + (ây1,y2:T2.y1 = y2 â f2 y1 y2 = true) â + (âz1,z2:T3.z1 = z2 â f3 z1 z2 = true) â + (âp1,p2:Prod3T T1 T2 T3. + (p1 = p2 â eq_triple T1 T2 T3 f1 f2 f3 p1 p2 = true)). + #T1; #T2; #T3; #f1; #f2; #f3; #H1; #H2; #H3; + #p1; nelim p1; #x1; #y1; #z1; + #p2; nelim p2; #x2; #y2; #z2; #H; + nnormalize; + nrewrite > (H1 ⦠(triple_destruct_1 ⦠H)); + nnormalize; + nrewrite > (H2 ⦠(triple_destruct_2 ⦠H)); + nnormalize; + nrewrite > (H3 ⦠(triple_destruct_3 ⦠H)); + napply refl_eq. +nqed. + +nlemma eqtriple_to_eq : +âT1,T2,T3. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool. + (âx1,x2:T1.f1 x1 x2 = true â x1 = x2) â + (ây1,y2:T2.f2 y1 y2 = true â y1 = y2) â + (âz1,z2:T3.f3 z1 z2 = true â z1 = z2) â + (âp1,p2:Prod3T T1 T2 T3. + (eq_triple T1 T2 T3 f1 f2 f3 p1 p2 = true â p1 = p2)). + #T1; #T2; #T3; #f1; #f2; #f3; #H1; #H2; #H3; + #p1; nelim p1; #x1; #y1; #z1; + #p2; nelim p2; #x2; #y2; #z2; #H; + nnormalize in H:(%); + nletin K â (H1 x1 x2); + ncases (f1 x1 x2) in H:(%) K:(%); + nnormalize; + ##[ ##2: #H4; ndestruct (*napply (bool_destruct ⦠H4)*) ##] + nletin K1 â (H2 y1 y2); + ncases (f2 y1 y2) in K1:(%) ⢠%; + nnormalize; + ##[ ##2: #H4; #H5; ndestruct (*napply (bool_destruct ⦠H5)*) ##] + #H4; #H5; #H6; + nrewrite > (H4 (refl_eq â¦)); + nrewrite > (H6 (refl_eq â¦)); + nrewrite > (H3 z1 z2 H5); + napply refl_eq. +nqed. + +nlemma decidable_triple : +âT1,T2,T3. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:Prod3T T1 T2 T3.decidable (x = y)). + #T1; #T2; #T3; #H; #H1; #H2; + #x; nelim x; #xx1; #xx2; #xx3; + #y; nelim y; #yy1; #yy2; #yy3; + nnormalize; + napply (or2_elim (xx1 = yy1) (xx1 â yy1) ? (H xx1 yy1) ?); + ##[ ##2: #H3; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H4; napply (H3 (triple_destruct_1 T1 T2 T3 ⦠H4)) + ##| ##1: #H3; napply (or2_elim (xx2 = yy2) (xx2 â yy2) ? (H1 xx2 yy2) ?); + ##[ ##2: #H4; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H5; napply (H4 (triple_destruct_2 T1 T2 T3 ⦠H5)) + ##| ##1: #H4; napply (or2_elim (xx3 = yy3) (xx3 â yy3) ? (H2 xx3 yy3) ?); + ##[ ##2: #H5; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H6; napply (H5 (triple_destruct_3 T1 T2 T3 ⦠H6)) + ##| ##1: #H5; napply (or2_intro1 (? = ?) (? â ?) ?); + nrewrite > H3; + nrewrite > H4; + nrewrite > H5; + napply refl_eq + ##] + ##] + ##] +nqed. + +nlemma neqtriple_to_neq : +âT1,T2,T3. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool. + (âx,y:T1.f1 x y = false â x â y) â + (âx,y:T2.f2 x y = false â x â y) â + (âx,y:T3.f3 x y = false â x â y) â + (âp1,p2:Prod3T T1 T2 T3. + (eq_triple T1 T2 T3 f1 f2 f3 p1 p2 = false â p1 â p2)). + #T1; #T2; #T3; #f1; #f2; #f3; #H1; #H2; #H3; + #p1; nelim p1; #x1; #y1; #z1; + #p2; nelim p2; #x2; #y2; #z2; + nchange with ((((f1 x1 x2) â (f2 y1 y2) â (f3 z1 z2)) = false) â ?); #H; + nnormalize; #H4; + napply (or3_elim ((f1 x1 x2) = false) ((f2 y1 y2) = false) ((f3 z1 z2) = false) ? (andb_false3 ⦠H) ?); + ##[ ##1: #H5; napply (H1 x1 x2 H5); napply (triple_destruct_1 T1 T2 T3 ⦠H4) + ##| ##2: #H5; napply (H2 y1 y2 H5); napply (triple_destruct_2 T1 T2 T3 ⦠H4) + ##| ##3: #H5; napply (H3 z1 z2 H5); napply (triple_destruct_3 T1 T2 T3 ⦠H4) + ##] +nqed. + +nlemma triple_destruct : +âT1,T2,T3. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx1,x2:T1.ây1,y2:T2.âz1,z2:T3. + (triple T1 T2 T3 x1 y1 z1) â (triple T1 T2 T3 x2 y2 z2) â + Or3 (x1 â x2) (y1 â y2) (z1 â z2)). + #T1; #T2; #T3; #H1; #H2; #H3; #x1; #x2; #y1; #y2; #z1; #z2; + nnormalize; #H; + napply (or2_elim (x1 = x2) (x1 â x2) ? (H1 x1 x2) ?); + ##[ ##2: #H4; napply (or3_intro1 ⦠H4) + ##| ##1: #H4; napply (or2_elim (y1 = y2) (y1 â y2) ? (H2 y1 y2) ?); + ##[ ##2: #H5; napply (or3_intro2 ⦠H5) + ##| ##1: #H5; napply (or2_elim (z1 = z2) (z1 â z2) ? (H3 z1 z2) ?); + ##[ ##2: #H6; napply (or3_intro3 ⦠H6) + ##| ##1: #H6; nrewrite > H4 in H:(%); + nrewrite > H5; + nrewrite > H6; #H; nelim (H (refl_eq â¦)) + ##] + ##] + ##] +nqed. + +nlemma neq_to_neqtriple : +âT1,T2,T3. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:T1.x â y â f1 x y = false) â + (âx,y:T2.x â y â f2 x y = false) â + (âx,y:T3.x â y â f3 x y = false) â + (âp1,p2:Prod3T T1 T2 T3. + (p1 â p2 â eq_triple T1 T2 T3 f1 f2 f3 p1 p2 = false)). + #T1; #T2; #T3; #f1; #f2; #f3; #H1; #H2; #H3; #H4; #H5; #H6; + #p1; nelim p1; #x1; #y1; #z1; + #p2; nelim p2; #x2; #y2; #z2; #H; + nchange with (((f1 x1 x2) â (f2 y1 y2) â (f3 z1 z2)) = false); + napply (or3_elim (x1 â x2) (y1 â y2) (z1 â z2) ? (triple_destruct T1 T2 T3 H1 H2 H3 ⦠H) ?); + ##[ ##1: #H7; nrewrite > (H4 ⦠H7); nrewrite > (andb_false3_1 (f2 y1 y2) (f3 z1 z2)); napply refl_eq + ##| ##2: #H7; nrewrite > (H5 ⦠H7); nrewrite > (andb_false3_2 (f1 x1 x2) (f3 z1 z2)); napply refl_eq + ##| ##3: #H7; nrewrite > (H6 ⦠H7); nrewrite > (andb_false3_3 (f1 x1 x2) (f2 y1 y2)); napply refl_eq + ##] +nqed. + +nlemma triple_is_comparable : + comparable â comparable â comparable â comparable. + #T1; #T2; #T3; napply (mk_comparable (Prod3T T1 T2 T3)); + ##[ napply (triple ⦠(zeroc T1) (zeroc T2) (zeroc T3)) + ##| napply (λx.false) + ##| napply (eq_triple ⦠(eqc T1) (eqc T2) (eqc T3)) + ##| napply (eqtriple_to_eq ⦠(eqc T1) (eqc T2) (eqc T3)); + ##[ napply (eqc_to_eq T1) + ##| napply (eqc_to_eq T2) + ##| napply (eqc_to_eq T3) + ##] + ##| napply (eq_to_eqtriple ⦠(eqc T1) (eqc T2) (eqc T3)); + ##[ napply (eq_to_eqc T1) + ##| napply (eq_to_eqc T2) + ##| napply (eq_to_eqc T3) + ##] + ##| napply (neqtriple_to_neq ⦠(eqc T1) (eqc T2) (eqc T3)); + ##[ napply (neqc_to_neq T1) + ##| napply (neqc_to_neq T2) + ##| napply (neqc_to_neq T3) + ##] + ##| napply (neq_to_neqtriple ⦠(eqc T1) (eqc T2) (eqc T3)); + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##| napply (decidable_c T3) + ##| napply (neq_to_neqc T1) + ##| napply (neq_to_neqc T2) + ##| napply (neq_to_neqc T3) + ##] + ##| napply decidable_triple; + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##| napply (decidable_c T3) + ##] + ##| napply symmetric_eqtriple; + ##[ napply (symmetric_eqc T1) + ##| napply (symmetric_eqc T2) + ##| napply (symmetric_eqc T3) + ##] + ##] +nqed. + +unification hint 0 â S1: comparable, S2: comparable, S3: comparable; + T1 â (carr S1), T2 â (carr S2), T3 â (carr S3), + X â (triple_is_comparable S1 S2 S3) + (*********************************************) ⢠+ carr X â¡ Prod3T T1 T2 T3. + +(* ********* *) +(* TUPLE x 4 *) +(* ********* *) + +nlemma quadruple_destruct_1 : +âT1,T2,T3,T4.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4. + quadruple T1 T2 T3 T4 x1 y1 z1 v1 = quadruple T1 T2 T3 T4 x2 y2 z2 v2 â x1 = x2. + #T1; #T2; #T3; #T4; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #H; + nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple a _ _ _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma quadruple_destruct_2 : +âT1,T2,T3,T4.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4. + quadruple T1 T2 T3 T4 x1 y1 z1 v1 = quadruple T1 T2 T3 T4 x2 y2 z2 v2 â y1 = y2. + #T1; #T2; #T3; #T4; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #H; + nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple _ b _ _ â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma quadruple_destruct_3 : +âT1,T2,T3,T4.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4. + quadruple T1 T2 T3 T4 x1 y1 z1 v1 = quadruple T1 T2 T3 T4 x2 y2 z2 v2 â z1 = z2. + #T1; #T2; #T3; #T4; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #H; + nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple _ _ c _ â z1 = c ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma quadruple_destruct_4 : +âT1,T2,T3,T4.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4. + quadruple T1 T2 T3 T4 x1 y1 z1 v1 = quadruple T1 T2 T3 T4 x2 y2 z2 v2 â v1 = v2. + #T1; #T2; #T3; #T4; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #H; + nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple _ _ _ d â v1 = d ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_eqquadruple : +âT1,T2,T3,T4:Type. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool. + (symmetricT T1 bool f1) â + (symmetricT T2 bool f2) â + (symmetricT T3 bool f3) â + (symmetricT T4 bool f4) â + (âp1,p2:Prod4T T1 T2 T3 T4. + (eq_quadruple T1 T2 T3 T4 f1 f2 f3 f4 p1 p2 = eq_quadruple T1 T2 T3 T4 f1 f2 f3 f4 p2 p1)). + #T1; #T2; #T3; #T4; #f1; #f2; #f3; #f4; #H; #H1; #H2; #H3; + #p1; nelim p1; #x1; #y1; #z1; #v1; + #p2; nelim p2; #x2; #y2; #z2; #v2; + nnormalize; + nrewrite > (H x1 x2); + ncases (f1 x2 x1); + nnormalize; + ##[ ##1: nrewrite > (H1 y1 y2); + ncases (f2 y2 y1); + nnormalize; + ##[ ##1: nrewrite > (H2 z1 z2); + ncases (f3 z2 z1); + nnormalize; + ##[ ##1: nrewrite > (H3 v1 v2); napply refl_eq + ##| ##2: napply refl_eq + ##] + ##| ##2: napply refl_eq + ##] + ##| ##2: napply refl_eq + ##] +nqed. + +nlemma eq_to_eqquadruple : +âT1,T2,T3,T4. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool. + (âx,y:T1.x = y â f1 x y = true) â + (âx,y:T2.x = y â f2 x y = true) â + (âx,y:T3.x = y â f3 x y = true) â + (âx,y:T4.x = y â f4 x y = true) â + (âp1,p2:Prod4T T1 T2 T3 T4. + (p1 = p2 â eq_quadruple T1 T2 T3 T4 f1 f2 f3 f4 p1 p2 = true)). + #T1; #T2; #T3; #T4; #f1; #f2; #f3; #f4; #H1; #H2; #H3; #H4; + #p1; nelim p1; #x1; #y1; #z1; #v1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #H; + nnormalize; + nrewrite > (H1 ⦠(quadruple_destruct_1 ⦠H)); + nnormalize; + nrewrite > (H2 ⦠(quadruple_destruct_2 ⦠H)); + nnormalize; + nrewrite > (H3 ⦠(quadruple_destruct_3 ⦠H)); + nnormalize; + nrewrite > (H4 ⦠(quadruple_destruct_4 ⦠H)); + napply refl_eq. +nqed. + +nlemma eqquadruple_to_eq : +âT1,T2,T3,T4. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool. + (âx,y:T1.f1 x y = true â x = y) â + (âx,y:T2.f2 x y = true â x = y) â + (âx,y:T3.f3 x y = true â x = y) â + (âx,y:T4.f4 x y = true â x = y) â + (âp1,p2:Prod4T T1 T2 T3 T4. + (eq_quadruple T1 T2 T3 T4 f1 f2 f3 f4 p1 p2 = true â p1 = p2)). + #T1; #T2; #T3; #T4; #f1; #f2; #f3; #f4; #H1; #H2; #H3; #H4; + #p1; nelim p1; #x1; #y1; #z1; #v1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #H; + nnormalize in H:(%); + nletin K â (H1 x1 x2); + ncases (f1 x1 x2) in H:(%) K:(%); + nnormalize; + ##[ ##2: #H5; ndestruct (*napply (bool_destruct ⦠H5)*) ##] + nletin K1 â (H2 y1 y2); + ncases (f2 y1 y2) in K1:(%) ⢠%; + nnormalize; + ##[ ##2: #H5; #H6; ndestruct (*napply (bool_destruct ⦠H6)*) ##] + nletin K2 â (H3 z1 z2); + ncases (f3 z1 z2) in K2:(%) ⢠%; + nnormalize; + ##[ ##2: #H5; #H6; #H7; ndestruct (*napply (bool_destruct ⦠H7)*) ##] + #H5; #H6; #H7; #H8; + nrewrite > (H5 (refl_eq â¦)); + nrewrite > (H6 (refl_eq â¦)); + nrewrite > (H8 (refl_eq â¦)); + nrewrite > (H4 v1 v2 H7); + napply refl_eq. +nqed. + +nlemma decidable_quadruple : +âT1,T2,T3,T4. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:T4.decidable (x = y)) â + (âx,y:Prod4T T1 T2 T3 T4.decidable (x = y)). + #T1; #T2; #T3; #T4; #H; #H1; #H2; #H3; + #x; nelim x; #xx1; #xx2; #xx3; #xx4; + #y; nelim y; #yy1; #yy2; #yy3; #yy4; + nnormalize; + napply (or2_elim (xx1 = yy1) (xx1 â yy1) ? (H xx1 yy1) ?); + ##[ ##2: #H4; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H5; napply (H4 (quadruple_destruct_1 T1 T2 T3 T4 ⦠H5)) + ##| ##1: #H4; napply (or2_elim (xx2 = yy2) (xx2 â yy2) ? (H1 xx2 yy2) ?); + ##[ ##2: #H5; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H6; napply (H5 (quadruple_destruct_2 T1 T2 T3 T4 ⦠H6)) + ##| ##1: #H5; napply (or2_elim (xx3 = yy3) (xx3 â yy3) ? (H2 xx3 yy3) ?); + ##[ ##2: #H6; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H7; napply (H6 (quadruple_destruct_3 T1 T2 T3 T4 ⦠H7)) + ##| ##1: #H6; napply (or2_elim (xx4 = yy4) (xx4 â yy4) ? (H3 xx4 yy4) ?); + ##[ ##2: #H7; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H8; napply (H7 (quadruple_destruct_4 T1 T2 T3 T4 ⦠H8)) + ##| ##1: #H7; napply (or2_intro1 (? = ?) (? â ?) ?); + nrewrite > H4; + nrewrite > H5; + nrewrite > H6; + nrewrite > H7; + napply refl_eq + ##] + ##] + ##] + ##] +nqed. + +nlemma neqquadruple_to_neq : +âT1,T2,T3,T4. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool. + (âx,y:T1.f1 x y = false â x â y) â + (âx,y:T2.f2 x y = false â x â y) â + (âx,y:T3.f3 x y = false â x â y) â + (âx,y:T4.f4 x y = false â x â y) â + (âp1,p2:Prod4T T1 T2 T3 T4. + (eq_quadruple T1 T2 T3 T4 f1 f2 f3 f4 p1 p2 = false â p1 â p2)). + #T1; #T2; #T3; #T4; #f1; #f2; #f3; #f4; #H1; #H2; #H3; #H4; + #p1; nelim p1; #x1; #y1; #z1; #v1; + #p2; nelim p2; #x2; #y2; #z2; #v2; + nchange with ((((f1 x1 x2) â (f2 y1 y2) â (f3 z1 z2) â (f4 v1 v2)) = false) â ?); #H; + nnormalize; #H5; + napply (or4_elim ((f1 x1 x2) = false) ((f2 y1 y2) = false) ((f3 z1 z2) = false) ((f4 v1 v2) = false) ? (andb_false4 ⦠H) ?); + ##[ ##1: #H6; napply (H1 x1 x2 H6); napply (quadruple_destruct_1 T1 T2 T3 T4 ⦠H5) + ##| ##2: #H6; napply (H2 y1 y2 H6); napply (quadruple_destruct_2 T1 T2 T3 T4 ⦠H5) + ##| ##3: #H6; napply (H3 z1 z2 H6); napply (quadruple_destruct_3 T1 T2 T3 T4 ⦠H5) + ##| ##4: #H6; napply (H4 v1 v2 H6); napply (quadruple_destruct_4 T1 T2 T3 T4 ⦠H5) + ##] +nqed. + +nlemma quadruple_destruct : +âT1,T2,T3,T4. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:T4.decidable (x = y)) â + (âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4. + (quadruple T1 T2 T3 T4 x1 y1 z1 v1) â (quadruple T1 T2 T3 T4 x2 y2 z2 v2) â + Or4 (x1 â x2) (y1 â y2) (z1 â z2) (v1 â v2)). + #T1; #T2; #T3; #T4; #H1; #H2; #H3; #H4; + #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; + nnormalize; #H; + napply (or2_elim (x1 = x2) (x1 â x2) ? (H1 x1 x2) ?); + ##[ ##2: #H5; napply (or4_intro1 ⦠H5) + ##| ##1: #H5; napply (or2_elim (y1 = y2) (y1 â y2) ? (H2 y1 y2) ?); + ##[ ##2: #H6; napply (or4_intro2 ⦠H6) + ##| ##1: #H6; napply (or2_elim (z1 = z2) (z1 â z2) ? (H3 z1 z2) ?); + ##[ ##2: #H7; napply (or4_intro3 ⦠H7) + ##| ##1: #H7; napply (or2_elim (v1 = v2) (v1 â v2) ? (H4 v1 v2) ?); + ##[ ##2: #H8; napply (or4_intro4 ⦠H8) + ##| ##1: #H8; nrewrite > H5 in H:(%); + nrewrite > H6; + nrewrite > H7; + nrewrite > H8; #H; nelim (H (refl_eq â¦)) + ##] + ##] + ##] + ##] +nqed. + +nlemma neq_to_neqquadruple : +âT1,T2,T3,T4. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:T4.decidable (x = y)) â + (âx,y:T1.x â y â f1 x y = false) â + (âx,y:T2.x â y â f2 x y = false) â + (âx,y:T3.x â y â f3 x y = false) â + (âx,y:T4.x â y â f4 x y = false) â + (âp1,p2:Prod4T T1 T2 T3 T4. + (p1 â p2 â eq_quadruple T1 T2 T3 T4 f1 f2 f3 f4 p1 p2 = false)). + #T1; #T2; #T3; #T4; #f1; #f2; #f3; #f4; #H1; #H2; #H3; #H4; #H5; #H6; #H7; #H8; + #p1; nelim p1; #x1; #y1; #z1; #v1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #H; + nchange with (((f1 x1 x2) â (f2 y1 y2) â (f3 z1 z2) â (f4 v1 v2)) = false); + napply (or4_elim (x1 â x2) (y1 â y2) (z1 â z2) (v1 â v2) ? (quadruple_destruct T1 T2 T3 T4 H1 H2 H3 H4 ⦠H) ?); + ##[ ##1: #H9; nrewrite > (H5 ⦠H9); nrewrite > (andb_false4_1 (f2 y1 y2) (f3 z1 z2) (f4 v1 v2)); napply refl_eq + ##| ##2: #H9; nrewrite > (H6 ⦠H9); nrewrite > (andb_false4_2 (f1 x1 x2) (f3 z1 z2) (f4 v1 v2)); napply refl_eq + ##| ##3: #H9; nrewrite > (H7 ⦠H9); nrewrite > (andb_false4_3 (f1 x1 x2) (f2 y1 y2) (f4 v1 v2)); napply refl_eq + ##| ##4: #H9; nrewrite > (H8 ⦠H9); nrewrite > (andb_false4_4 (f1 x1 x2) (f2 y1 y2) (f3 z1 z2)); napply refl_eq + ##] +nqed. + +nlemma quadruple_is_comparable : + comparable â comparable â comparable â comparable â comparable. + #T1; #T2; #T3; #T4; napply (mk_comparable (Prod4T T1 T2 T3 T4)); + ##[ napply (quadruple ⦠(zeroc T1) (zeroc T2) (zeroc T3) (zeroc T4)) + ##| napply (λx.false) + ##| napply (eq_quadruple ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4)) + ##| napply (eqquadruple_to_eq ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4)); + ##[ napply (eqc_to_eq T1) + ##| napply (eqc_to_eq T2) + ##| napply (eqc_to_eq T3) + ##| napply (eqc_to_eq T4) + ##] + ##| napply (eq_to_eqquadruple ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4)); + ##[ napply (eq_to_eqc T1) + ##| napply (eq_to_eqc T2) + ##| napply (eq_to_eqc T3) + ##| napply (eq_to_eqc T4) + ##] + ##| napply (neqquadruple_to_neq ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4)); + ##[ napply (neqc_to_neq T1) + ##| napply (neqc_to_neq T2) + ##| napply (neqc_to_neq T3) + ##| napply (neqc_to_neq T4) + ##] + ##| napply (neq_to_neqquadruple ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4)); + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##| napply (decidable_c T3) + ##| napply (decidable_c T4) + ##| napply (neq_to_neqc T1) + ##| napply (neq_to_neqc T2) + ##| napply (neq_to_neqc T3) + ##| napply (neq_to_neqc T4) + ##] + ##| napply decidable_quadruple; + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##| napply (decidable_c T3) + ##| napply (decidable_c T4) + ##] + ##| napply symmetric_eqquadruple; + ##[ napply (symmetric_eqc T1) + ##| napply (symmetric_eqc T2) + ##| napply (symmetric_eqc T3) + ##| napply (symmetric_eqc T4) + ##] + ##] +nqed. + +unification hint 0 â S1: comparable, S2: comparable, S3: comparable, S4: comparable; + T1 â (carr S1), T2 â (carr S2), T3 â (carr S3), T4 â (carr S4), + X â (quadruple_is_comparable S1 S2 S3 S4) + (*********************************************) ⢠+ carr X â¡ Prod4T T1 T2 T3 T4. + +(* ********* *) +(* TUPLE x 5 *) +(* ********* *) + +nlemma quintuple_destruct_1 : +âT1,T2,T3,T4,T5.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4.âw1,w2:T5. + quintuple T1 T2 T3 T4 T5 x1 y1 z1 v1 w1 = quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 â x1 = x2. + #T1; #T2; #T3; #T4; #T5; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #w1; #w2; #H; + nchange with (match quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 with [ quintuple a _ _ _ _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma quintuple_destruct_2 : +âT1,T2,T3,T4,T5.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4.âw1,w2:T5. + quintuple T1 T2 T3 T4 T5 x1 y1 z1 v1 w1 = quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 â y1 = y2. + #T1; #T2; #T3; #T4; #T5; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #w1; #w2; #H; + nchange with (match quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 with [ quintuple _ b _ _ _ â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma quintuple_destruct_3 : +âT1,T2,T3,T4,T5.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4.âw1,w2:T5. + quintuple T1 T2 T3 T4 T5 x1 y1 z1 v1 w1 = quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 â z1 = z2. + #T1; #T2; #T3; #T4; #T5; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #w1; #w2; #H; + nchange with (match quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 with [ quintuple _ _ c _ _ â z1 = c ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma quintuple_destruct_4 : +âT1,T2,T3,T4,T5.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4.âw1,w2:T5. + quintuple T1 T2 T3 T4 T5 x1 y1 z1 v1 w1 = quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 â v1 = v2. + #T1; #T2; #T3; #T4; #T5; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #w1; #w2; #H; + nchange with (match quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 with [ quintuple _ _ _ d _ â v1 = d ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma quintuple_destruct_5 : +âT1,T2,T3,T4,T5.âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4.âw1,w2:T5. + quintuple T1 T2 T3 T4 T5 x1 y1 z1 v1 w1 = quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 â w1 = w2. + #T1; #T2; #T3; #T4; #T5; #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #w1; #w2; #H; + nchange with (match quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2 with [ quintuple _ _ _ _ e â w1 = e ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_eqquintuple : +âT1,T2,T3,T4,T5:Type. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool.âf5:T5 â T5 â bool. + (symmetricT T1 bool f1) â + (symmetricT T2 bool f2) â + (symmetricT T3 bool f3) â + (symmetricT T4 bool f4) â + (symmetricT T5 bool f5) â + (âp1,p2:Prod5T T1 T2 T3 T4 T5. + (eq_quintuple T1 T2 T3 T4 T5 f1 f2 f3 f4 f5 p1 p2 = eq_quintuple T1 T2 T3 T4 T5 f1 f2 f3 f4 f5 p2 p1)). + #T1; #T2; #T3; #T4; #T5; #f1; #f2; #f3; #f4; #f5; #H; #H1; #H2; #H3; #H4; + #p1; nelim p1; #x1; #y1; #z1; #v1; #w1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #w2; + nnormalize; + nrewrite > (H x1 x2); + ncases (f1 x2 x1); + nnormalize; + ##[ ##1: nrewrite > (H1 y1 y2); + ncases (f2 y2 y1); + nnormalize; + ##[ ##1: nrewrite > (H2 z1 z2); + ncases (f3 z2 z1); + nnormalize; + ##[ ##1: nrewrite > (H3 v1 v2); + ncases (f4 v2 v1); + nnormalize; + ##[ ##1: nrewrite > (H4 w1 w2); napply refl_eq + ##| ##2: napply refl_eq + ##] + ##| ##2: napply refl_eq + ##] + ##| ##2: napply refl_eq + ##] + ##| ##2: napply refl_eq + ##] +nqed. + +nlemma eq_to_eqquintuple : +âT1,T2,T3,T4,T5. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool.âf5:T5 â T5 â bool. + (âx,y:T1.x = y â f1 x y = true) â + (âx,y:T2.x = y â f2 x y = true) â + (âx,y:T3.x = y â f3 x y = true) â + (âx,y:T4.x = y â f4 x y = true) â + (âx,y:T5.x = y â f5 x y = true) â + (âp1,p2:Prod5T T1 T2 T3 T4 T5. + (p1 = p2 â eq_quintuple T1 T2 T3 T4 T5 f1 f2 f3 f4 f5 p1 p2 = true)). + #T1; #T2; #T3; #T4; #T5; #f1; #f2; #f3; #f4; #f5; #H1; #H2; #H3; #H4; #H5; + #p1; nelim p1; #x1; #y1; #z1; #v1; #w1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #w2; #H; + nnormalize; + nrewrite > (H1 ⦠(quintuple_destruct_1 ⦠H)); + nnormalize; + nrewrite > (H2 ⦠(quintuple_destruct_2 ⦠H)); + nnormalize; + nrewrite > (H3 ⦠(quintuple_destruct_3 ⦠H)); + nnormalize; + nrewrite > (H4 ⦠(quintuple_destruct_4 ⦠H)); + nnormalize; + nrewrite > (H5 ⦠(quintuple_destruct_5 ⦠H)); + napply refl_eq. +nqed. + +nlemma eqquintuple_to_eq : +âT1,T2,T3,T4,T5. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool.âf5:T5 â T5 â bool. + (âx,y:T1.f1 x y = true â x = y) â + (âx,y:T2.f2 x y = true â x = y) â + (âx,y:T3.f3 x y = true â x = y) â + (âx,y:T4.f4 x y = true â x = y) â + (âx,y:T5.f5 x y = true â x = y) â + (âp1,p2:Prod5T T1 T2 T3 T4 T5. + (eq_quintuple T1 T2 T3 T4 T5 f1 f2 f3 f4 f5 p1 p2 = true â p1 = p2)). + #T1; #T2; #T3; #T4; #T5; #f1; #f2; #f3; #f4; #f5; #H1; #H2; #H3; #H4; #H5; + #p1; nelim p1; #x1; #y1; #z1; #v1; #w1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #w2; #H; + nnormalize in H:(%); + nletin K â (H1 x1 x2); + ncases (f1 x1 x2) in H:(%) K:(%); + nnormalize; + ##[ ##2: #H6; ndestruct (*napply (bool_destruct ⦠H6)*) ##] + nletin K1 â (H2 y1 y2); + ncases (f2 y1 y2) in K1:(%) ⢠%; + nnormalize; + ##[ ##2: #H6; #H7; ndestruct (*napply (bool_destruct ⦠H7)*) ##] + nletin K2 â (H3 z1 z2); + ncases (f3 z1 z2) in K2:(%) ⢠%; + nnormalize; + ##[ ##2: #H6; #H7; #H8; ndestruct (*napply (bool_destruct ⦠H8)*) ##] + nletin K3 â (H4 v1 v2); + ncases (f4 v1 v2) in K3:(%) ⢠%; + nnormalize; + ##[ ##2: #H6; #H7; #H8; #H9; ndestruct (*napply (bool_destruct ⦠H9)*) ##] + #H6; #H7; #H8; #H9; #H10; + nrewrite > (H6 (refl_eq â¦)); + nrewrite > (H7 (refl_eq â¦)); + nrewrite > (H8 (refl_eq â¦)); + nrewrite > (H10 (refl_eq â¦)); + nrewrite > (H5 w1 w2 H9); + napply refl_eq. +nqed. + +nlemma decidable_quintuple : +âT1,T2,T3,T4,T5. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:T4.decidable (x = y)) â + (âx,y:T5.decidable (x = y)) â + (âx,y:Prod5T T1 T2 T3 T4 T5.decidable (x = y)). + #T1; #T2; #T3; #T4; #T5; #H; #H1; #H2; #H3; #H4; + #x; nelim x; #xx1; #xx2; #xx3; #xx4; #xx5; + #y; nelim y; #yy1; #yy2; #yy3; #yy4; #yy5; + nnormalize; + napply (or2_elim (xx1 = yy1) (xx1 â yy1) ? (H xx1 yy1) ?); + ##[ ##2: #H5; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H6; napply (H5 (quintuple_destruct_1 T1 T2 T3 T4 T5 ⦠H6)) + ##| ##1: #H5; napply (or2_elim (xx2 = yy2) (xx2 â yy2) ? (H1 xx2 yy2) ?); + ##[ ##2: #H6; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H7; napply (H6 (quintuple_destruct_2 T1 T2 T3 T4 T5 ⦠H7)) + ##| ##1: #H6; napply (or2_elim (xx3 = yy3) (xx3 â yy3) ? (H2 xx3 yy3) ?); + ##[ ##2: #H7; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H8; napply (H7 (quintuple_destruct_3 T1 T2 T3 T4 T5 ⦠H8)) + ##| ##1: #H7; napply (or2_elim (xx4 = yy4) (xx4 â yy4) ? (H3 xx4 yy4) ?); + ##[ ##2: #H8; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H9; napply (H8 (quintuple_destruct_4 T1 T2 T3 T4 T5 ⦠H9)) + ##| ##1: #H8; napply (or2_elim (xx5 = yy5) (xx5 â yy5) ? (H4 xx5 yy5) ?); + ##[ ##2: #H9; napply (or2_intro2 (? = ?) (? â ?) ?); + nnormalize; #H10; napply (H9 (quintuple_destruct_5 T1 T2 T3 T4 T5 ⦠H10)) + ##| ##1: #H9; napply (or2_intro1 (? = ?) (? â ?) ?); + nrewrite > H5; + nrewrite > H6; + nrewrite > H7; + nrewrite > H8; + nrewrite > H9; + napply refl_eq + ##] + ##] + ##] + ##] + ##] +nqed. + +nlemma neqquintuple_to_neq : +âT1,T2,T3,T4,T5. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool.âf5:T5 â T5 â bool. + (âx,y:T1.f1 x y = false â x â y) â + (âx,y:T2.f2 x y = false â x â y) â + (âx,y:T3.f3 x y = false â x â y) â + (âx,y:T4.f4 x y = false â x â y) â + (âx,y:T5.f5 x y = false â x â y) â + (âp1,p2:Prod5T T1 T2 T3 T4 T5. + (eq_quintuple T1 T2 T3 T4 T5 f1 f2 f3 f4 f5 p1 p2 = false â p1 â p2)). + #T1; #T2; #T3; #T4; #T5; #f1; #f2; #f3; #f4; #f5; #H1; #H2; #H3; #H4; #H5; + #p1; nelim p1; #x1; #y1; #z1; #v1; #w1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #w2; + nchange with ((((f1 x1 x2) â (f2 y1 y2) â (f3 z1 z2) â (f4 v1 v2) â (f5 w1 w2)) = false) â ?); #H; + nnormalize; #H6; + napply (or5_elim ((f1 x1 x2) = false) ((f2 y1 y2) = false) ((f3 z1 z2) = false) ((f4 v1 v2) = false) ((f5 w1 w2) = false) ? (andb_false5 ⦠H) ?); + ##[ ##1: #H7; napply (H1 x1 x2 H7); napply (quintuple_destruct_1 T1 T2 T3 T4 T5 ⦠H6) + ##| ##2: #H7; napply (H2 y1 y2 H7); napply (quintuple_destruct_2 T1 T2 T3 T4 T5 ⦠H6) + ##| ##3: #H7; napply (H3 z1 z2 H7); napply (quintuple_destruct_3 T1 T2 T3 T4 T5 ⦠H6) + ##| ##4: #H7; napply (H4 v1 v2 H7); napply (quintuple_destruct_4 T1 T2 T3 T4 T5 ⦠H6) + ##| ##5: #H7; napply (H5 w1 w2 H7); napply (quintuple_destruct_5 T1 T2 T3 T4 T5 ⦠H6) + ##] +nqed. + +nlemma quintuple_destruct : +âT1,T2,T3,T4,T5. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:T4.decidable (x = y)) â + (âx,y:T5.decidable (x = y)) â + (âx1,x2:T1.ây1,y2:T2.âz1,z2:T3.âv1,v2:T4.âw1,w2:T5. + (quintuple T1 T2 T3 T4 T5 x1 y1 z1 v1 w1) â (quintuple T1 T2 T3 T4 T5 x2 y2 z2 v2 w2) â + Or5 (x1 â x2) (y1 â y2) (z1 â z2) (v1 â v2) (w1 â w2)). + #T1; #T2; #T3; #T4; #T5; #H1; #H2; #H3; #H4; #H5; + #x1; #x2; #y1; #y2; #z1; #z2; #v1; #v2; #w1; #w2; + nnormalize; #H; + napply (or2_elim (x1 = x2) (x1 â x2) ? (H1 x1 x2) ?); + ##[ ##2: #H6; napply (or5_intro1 ⦠H6) + ##| ##1: #H6; napply (or2_elim (y1 = y2) (y1 â y2) ? (H2 y1 y2) ?); + ##[ ##2: #H7; napply (or5_intro2 ⦠H7) + ##| ##1: #H7; napply (or2_elim (z1 = z2) (z1 â z2) ? (H3 z1 z2) ?); + ##[ ##2: #H8; napply (or5_intro3 ⦠H8) + ##| ##1: #H8; napply (or2_elim (v1 = v2) (v1 â v2) ? (H4 v1 v2) ?); + ##[ ##2: #H9; napply (or5_intro4 ⦠H9) + ##| ##1: #H9; napply (or2_elim (w1 = w2) (w1 â w2) ? (H5 w1 w2) ?); + ##[ ##2: #H10; napply (or5_intro5 ⦠H10) + ##| ##1: #H10; nrewrite > H6 in H:(%); + nrewrite > H7; + nrewrite > H8; + nrewrite > H9; + nrewrite > H10; #H; nelim (H (refl_eq â¦)) + ##] + ##] + ##] + ##] + ##] +nqed. + +nlemma neq_to_neqquintuple : +âT1,T2,T3,T4,T5. +âf1:T1 â T1 â bool.âf2:T2 â T2 â bool.âf3:T3 â T3 â bool.âf4:T4 â T4 â bool.âf5:T5 â T5 â bool. + (âx,y:T1.decidable (x = y)) â + (âx,y:T2.decidable (x = y)) â + (âx,y:T3.decidable (x = y)) â + (âx,y:T4.decidable (x = y)) â + (âx,y:T5.decidable (x = y)) â + (âx,y:T1.x â y â f1 x y = false) â + (âx,y:T2.x â y â f2 x y = false) â + (âx,y:T3.x â y â f3 x y = false) â + (âx,y:T4.x â y â f4 x y = false) â + (âx,y:T5.x â y â f5 x y = false) â + (âp1,p2:Prod5T T1 T2 T3 T4 T5. + (p1 â p2 â eq_quintuple T1 T2 T3 T4 T5 f1 f2 f3 f4 f5 p1 p2 = false)). + #T1; #T2; #T3; #T4; #T5; #f1; #f2; #f3; #f4; #f5; + #H1; #H2; #H3; #H4; #H5; #H6; #H7; #H8; #H9; #H10; + #p1; nelim p1; #x1; #y1; #z1; #v1; #w1; + #p2; nelim p2; #x2; #y2; #z2; #v2; #w2; #H; + nchange with (((f1 x1 x2) â (f2 y1 y2) â (f3 z1 z2) â (f4 v1 v2) â (f5 w1 w2)) = false); + napply (or5_elim (x1 â x2) (y1 â y2) (z1 â z2) (v1 â v2) (w1 â w2) ? (quintuple_destruct T1 T2 T3 T4 T5 H1 H2 H3 H4 H5 ⦠H) ?); + ##[ ##1: #H11; nrewrite > (H6 ⦠H11); nrewrite > (andb_false5_1 (f2 y1 y2) (f3 z1 z2) (f4 v1 v2) (f5 w1 w2)); napply refl_eq + ##| ##2: #H11; nrewrite > (H7 ⦠H11); nrewrite > (andb_false5_2 (f1 x1 x2) (f3 z1 z2) (f4 v1 v2) (f5 w1 w2)); napply refl_eq + ##| ##3: #H11; nrewrite > (H8 ⦠H11); nrewrite > (andb_false5_3 (f1 x1 x2) (f2 y1 y2) (f4 v1 v2) (f5 w1 w2)); napply refl_eq + ##| ##4: #H11; nrewrite > (H9 ⦠H11); nrewrite > (andb_false5_4 (f1 x1 x2) (f2 y1 y2) (f3 z1 z2) (f5 w1 w2)); napply refl_eq + ##| ##5: #H11; nrewrite > (H10 ⦠H11); nrewrite > (andb_false5_5 (f1 x1 x2) (f2 y1 y2) (f3 z1 z2) (f4 v1 v2)); napply refl_eq + ##] +nqed. + +nlemma quintuple_is_comparable : + comparable â comparable â comparable â comparable â comparable â comparable. + #T1; #T2; #T3; #T4; #T5; napply (mk_comparable (Prod5T T1 T2 T3 T4 T5)); + ##[ napply (quintuple ⦠(zeroc T1) (zeroc T2) (zeroc T3) (zeroc T4) (zeroc T5)) + ##| napply (λx.false) + ##| napply (eq_quintuple ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4) (eqc T5)) + ##| napply (eqquintuple_to_eq ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4) (eqc T5)); + ##[ napply (eqc_to_eq T1) + ##| napply (eqc_to_eq T2) + ##| napply (eqc_to_eq T3) + ##| napply (eqc_to_eq T4) + ##| napply (eqc_to_eq T5) + ##] + ##| napply (eq_to_eqquintuple ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4) (eqc T5)); + ##[ napply (eq_to_eqc T1) + ##| napply (eq_to_eqc T2) + ##| napply (eq_to_eqc T3) + ##| napply (eq_to_eqc T4) + ##| napply (eq_to_eqc T5) + ##] + ##| napply (neqquintuple_to_neq ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4) (eqc T5)); + ##[ napply (neqc_to_neq T1) + ##| napply (neqc_to_neq T2) + ##| napply (neqc_to_neq T3) + ##| napply (neqc_to_neq T4) + ##| napply (neqc_to_neq T5) + ##] + ##| napply (neq_to_neqquintuple ⦠(eqc T1) (eqc T2) (eqc T3) (eqc T4) (eqc T5)); + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##| napply (decidable_c T3) + ##| napply (decidable_c T4) + ##| napply (decidable_c T5) + ##| napply (neq_to_neqc T1) + ##| napply (neq_to_neqc T2) + ##| napply (neq_to_neqc T3) + ##| napply (neq_to_neqc T4) + ##| napply (neq_to_neqc T5) + ##] + ##| napply decidable_quintuple; + ##[ napply (decidable_c T1) + ##| napply (decidable_c T2) + ##| napply (decidable_c T3) + ##| napply (decidable_c T4) + ##| napply (decidable_c T5) + ##] + ##| napply symmetric_eqquintuple; + ##[ napply (symmetric_eqc T1) + ##| napply (symmetric_eqc T2) + ##| napply (symmetric_eqc T3) + ##| napply (symmetric_eqc T4) + ##| napply (symmetric_eqc T5) + ##] + ##] +nqed. + +unification hint 0 â S1: comparable, S2: comparable, S3: comparable, S4: comparable, S5: comparable; + T1 â (carr S1), T2 â (carr S2), T3 â (carr S3), T4 â (carr S4), T5 â (carr S5), + X â (quintuple_is_comparable S1 S2 S3 S4 S5) + (*********************************************) ⢠+ carr X â¡ Prod5T T1 T2 T3 T4 T5. diff --git a/helm/software/matita/contribs/ng_assembly2/common/prod_base.ma b/helm/software/matita/contribs/ng_assembly2/common/prod_base.ma new file mode 100644 index 000000000..1080533d1 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/prod_base.ma @@ -0,0 +1,115 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/bool.ma". + +(* ***** *) +(* TUPLE *) +(* ***** *) + +ninductive ProdT (T1:Type) (T2:Type) : Type â + pair : T1 â T2 â ProdT T1 T2. + +ndefinition fst â +λT1,T2:Type.λp:ProdT T1 T2.match p with [ pair x _ â x ]. + +ndefinition snd â +λT1,T2:Type.λp:ProdT T1 T2.match p with [ pair _ x â x ]. + +ndefinition eq_pair â +λT1,T2:Type. +λf1:T1 â T1 â bool.λf2:T2 â T2 â bool. +λp1,p2:ProdT T1 T2. + (f1 (fst ⦠p1) (fst ⦠p2)) â + (f2 (snd ⦠p1) (snd ⦠p2)). + +ninductive Prod3T (T1:Type) (T2:Type) (T3:Type) : Type â +triple : T1 â T2 â T3 â Prod3T T1 T2 T3. + +ndefinition fst3T â +λT1.λT2.λT3.λp:Prod3T T1 T2 T3.match p with [ triple x _ _ â x ]. + +ndefinition snd3T â +λT1.λT2.λT3.λp:Prod3T T1 T2 T3.match p with [ triple _ x _ â x ]. + +ndefinition thd3T â +λT1.λT2.λT3.λp:Prod3T T1 T2 T3.match p with [ triple _ _ x â x ]. + +ndefinition eq_triple â +λT1,T2,T3:Type. +λf1:T1 â T1 â bool.λf2:T2 â T2 â bool.λf3:T3 â T3 â bool. +λp1,p2:Prod3T T1 T2 T3. + (f1 (fst3T ⦠p1) (fst3T ⦠p2)) â + (f2 (snd3T ⦠p1) (snd3T ⦠p2)) â + (f3 (thd3T ⦠p1) (thd3T ⦠p2)). + +ninductive Prod4T (T1:Type) (T2:Type) (T3:Type) (T4:Type) : Type â +quadruple : T1 â T2 â T3 â T4 â Prod4T T1 T2 T3 T4. + +ndefinition fst4T â +λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple x _ _ _ â x ]. + +ndefinition snd4T â +λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple _ x _ _ â x ]. + +ndefinition thd4T â +λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple _ _ x _ â x ]. + +ndefinition fth4T â +λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple _ _ _ x â x ]. + +ndefinition eq_quadruple â +λT1,T2,T3,T4:Type. +λf1:T1 â T1 â bool.λf2:T2 â T2 â bool.λf3:T3 â T3 â bool.λf4:T4 â T4 â bool. +λp1,p2:Prod4T T1 T2 T3 T4. + (f1 (fst4T ⦠p1) (fst4T ⦠p2)) â + (f2 (snd4T ⦠p1) (snd4T ⦠p2)) â + (f3 (thd4T ⦠p1) (thd4T ⦠p2)) â + (f4 (fth4T ⦠p1) (fth4T ⦠p2)). + +ninductive Prod5T (T1:Type) (T2:Type) (T3:Type) (T4:Type) (T5:Type) : Type â +quintuple : T1 â T2 â T3 â T4 â T5 â Prod5T T1 T2 T3 T4 T5. + +ndefinition fst5T â +λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple x _ _ _ _ â x ]. + +ndefinition snd5T â +λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ x _ _ _ â x ]. + +ndefinition thd5T â +λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ _ x _ _ â x ]. + +ndefinition fth5T â +λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ _ _ x _ â x ]. + +ndefinition fft5T â +λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ _ _ _ x â x ]. + +ndefinition eq_quintuple â +λT1,T2,T3,T4,T5:Type. +λf1:T1 â T1 â bool.λf2:T2 â T2 â bool.λf3:T3 â T3 â bool.λf4:T4 â T4 â bool.λf5:T5 â T5 â bool. +λp1,p2:Prod5T T1 T2 T3 T4 T5. + (f1 (fst5T ⦠p1) (fst5T ⦠p2)) â + (f2 (snd5T ⦠p1) (snd5T ⦠p2)) â + (f3 (thd5T ⦠p1) (thd5T ⦠p2)) â + (f4 (fth5T ⦠p1) (fth5T ⦠p2)) â + (f5 (fft5T ⦠p1) (fft5T ⦠p2)). diff --git a/helm/software/matita/contribs/ng_assembly2/common/pts.ma b/helm/software/matita/contribs/ng_assembly2/common/pts.ma new file mode 100644 index 000000000..428772bbc --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/pts.ma @@ -0,0 +1,26 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +universe constraint Type[0] < Type[1]. +universe constraint Type[1] < Type[2]. +universe constraint Type[2] < Type[3]. +universe constraint Type[3] < Type[4]. diff --git a/helm/software/matita/contribs/ng_assembly2/common/sigma.ma b/helm/software/matita/contribs/ng_assembly2/common/sigma.ma new file mode 100755 index 000000000..529ca7ada --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/sigma.ma @@ -0,0 +1,52 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/theory.ma". + +(* coppia dipendente *) + +ninductive sigma (A:Type) (P:A â Type) : Type â + sigma_intro: âx:A.P x â sigma A P. + +notation < "hvbox(\Sigma ident i opt (: tx) break . p)" + right associative with precedence 20 +for @{ 'Sigma ${default + @{\lambda ${ident i} : $tx. $p} + @{\lambda ${ident i} . $p}}}. + +notation > "\Sigma list1 ident x sep , opt (: T). term 19 Px" + with precedence 20 + for ${ default + @{ ${ fold right @{$Px} rec acc @{'Sigma (λ${ident x}:$T.$acc)} } } + @{ ${ fold right @{$Px} rec acc @{'Sigma (λ${ident x}.$acc)} } } + }. + +notation "\ll term 19 a, break term 19 b \gg" +with precedence 90 for @{'dependent_pair (λx:?.? x) $a $b}. +interpretation "dependent pair" 'dependent_pair \eta.c a b = (sigma_intro ? c a b). + +interpretation "sigma" 'Sigma \eta.x = (sigma ? x). + +ndefinition sigmaFst â +λT:Type.λf:T â Type.λs:sigma T f.match s with [ sigma_intro x _ â x ]. +ndefinition sigmaSnd â +λT:Type.λf:T â Type.λs:sigma T f.match s return λs.f (sigmaFst ?? s) with [ sigma_intro _ x â x ]. diff --git a/helm/software/matita/contribs/ng_assembly2/common/string.ma b/helm/software/matita/contribs/ng_assembly2/common/string.ma new file mode 100644 index 000000000..00b70cfc4 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/string.ma @@ -0,0 +1,183 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/ascii.ma". +include "common/list.ma". + +(* ******* *) +(* STRINGA *) +(* ******* *) + +(* tipo pubblico *) +ndefinition aux_str_type â list ascii. + +unification hint 0 â ⢠carr (list_is_comparable ascii_is_comparable) â¡ list ascii. +unification hint 0 â ⢠carr (list_is_comparable ascii_is_comparable) â¡ aux_str_type. + +(* ************ *) +(* STRINGA + ID *) +(* ************ *) + +(* tipo pubblico *) +nrecord strId : Type â + { + str_elem: aux_str_type; + id_elem: nat + }. + +(* confronto *) +ndefinition eq_strId â +λsid,sid':strId. + (eqc ? (str_elem sid) (str_elem sid'))â + (eqc ? (id_elem sid) (id_elem sid')). + +nlemma strid_destruct_1 : âx1,x2,y1,y2.mk_strId x1 y1 = mk_strId x2 y2 â x1 = x2. + #x1; #x2; #y1; #y2; #H; + nchange with (match mk_strId x2 y2 with [ mk_strId a _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma strid_destruct_2 : âx1,x2,y1,y2.mk_strId x1 y1 = mk_strId x2 y2 â y1 = y2. + #x1; #x2; #y1; #y2; #H; + nchange with (match mk_strId x2 y2 with [ mk_strId _ b â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_eqstrid : symmetricT strId bool eq_strId. + #si1; #si2; + nchange with ( + ((eqc ? (str_elem si1) (str_elem si2))â(eqc ? (id_elem si1) (id_elem si2))) = + ((eqc ? (str_elem si2) (str_elem si1))â(eqc ? (id_elem si2) (id_elem si1)))); + nrewrite > (symmetric_eqc ? (str_elem si1) (str_elem si2)); + nrewrite > (symmetric_eqc ? (id_elem si1) (id_elem si2)); + napply refl_eq. +nqed. + +nlemma eqstrid_to_eq : âs,s'.eq_strId s s' = true â s = s'. + #si1; #si2; + nelim si1; + #l1; #n1; + nelim si2; + #l2; #n2; #H; + nchange in H:(%) with (((eqc ? l1 l2)â(eqc ? n1 n2)) = true); + nrewrite > (eqc_to_eq ? l1 l2 (andb_true_true_l ⦠H)); + nrewrite > (eqc_to_eq ? n1 n2 (andb_true_true_r ⦠H)); + napply refl_eq. +nqed. + +nlemma eq_to_eqstrid : âs,s'.s = s' â eq_strId s s' = true. + #si1; #si2; + nelim si1; + #l1; #n1; + nelim si2; + #l2; #n2; #H; + nchange with (((eqc ? l1 l2)â(eqc ? n1 n2)) = true); + nrewrite > (strid_destruct_1 ⦠H); + nrewrite > (strid_destruct_2 ⦠H); + nrewrite > (eq_to_eqc ? l2 l2 (refl_eq â¦)); + nrewrite > (eq_to_eqc ? n2 n2 (refl_eq â¦)); + nnormalize; + napply refl_eq. +nqed. + +nlemma decidable_strid_aux1 : âs1,n1,s2,n2.s1 â s2 â (mk_strId s1 n1) â (mk_strId s2 n2). + #s1; #n1; #s2; #n2; + nnormalize; #H; #H1; + napply (H (strid_destruct_1 ⦠H1)). +nqed. + +nlemma decidable_strid_aux2 : âs1,n1,s2,n2.n1 â n2 â (mk_strId s1 n1) â (mk_strId s2 n2). + #s1; #n1; #s2; #n2; + nnormalize; #H; #H1; + napply (H (strid_destruct_2 ⦠H1)). +nqed. + +nlemma decidable_strid : âx,y:strId.decidable (x = y). + #x; nelim x; #s1; #n1; + #y; nelim y; #s2; #n2; + nnormalize; + napply (or2_elim (s1 = s2) (s1 â s2) ? (decidable_c ? s1 s2) â¦); + ##[ ##2: #H; napply (or2_intro2 ⦠(decidable_strid_aux1 ⦠H)) + ##| ##1: #H; napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_c ? n1 n2) â¦); + ##[ ##2: #H1; napply (or2_intro2 ⦠(decidable_strid_aux2 ⦠H1)) + ##| ##1: #H1; nrewrite > H; nrewrite > H1; + napply (or2_intro1 ⦠(refl_eq ? (mk_strId s2 n2))) + ##] + ##] +nqed. + +nlemma neqstrid_to_neq : âsid1,sid2:strId.(eq_strId sid1 sid2 = false) â (sid1 â sid2). + #sid1; nelim sid1; #s1; #n1; + #sid2; nelim sid2; #s2; #n2; + nchange with ((((eqc ? s1 s2) â (eqc ? n1 n2)) = false) â ?); + #H; + napply (or2_elim ((eqc ? s1 s2) = false) ((eqc ? n1 n2) = false) ? (andb_false2 ⦠H) â¦); + ##[ ##1: #H1; napply (decidable_strid_aux1 ⦠(neqc_to_neq ⦠H1)) + ##| ##2: #H1; napply (decidable_strid_aux2 ⦠(neqc_to_neq ⦠H1)) + ##] +nqed. + +nlemma strid_destruct : âs1,s2,n1,n2.(mk_strId s1 n1) â (mk_strId s2 n2) â s1 â s2 ⨠n1 â n2. + #s1; #s2; #n1; #n2; + nnormalize; #H; + napply (or2_elim (s1 = s2) (s1 â s2) ? (decidable_c ? s1 s2) â¦); + ##[ ##2: #H1; napply (or2_intro1 ⦠H1) + ##| ##1: #H1; napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_c ? n1 n2) â¦); + ##[ ##2: #H2; napply (or2_intro2 ⦠H2) + ##| ##1: #H2; nrewrite > H1 in H:(%); + nrewrite > H2; + #H; nelim (H (refl_eq â¦)) + ##] + ##] +nqed. + +nlemma neq_to_neqstrid : âsid1,sid2.sid1 â sid2 â eq_strId sid1 sid2 = false. + #sid1; nelim sid1; #s1; #n1; + #sid2; nelim sid2; #s2; #n2; + #H; nchange with (((eqc ? s1 s2) â (eqc ? n1 n2)) = false); + napply (or2_elim (s1 â s2) (n1 â n2) ? (strid_destruct ⦠H) â¦); + ##[ ##1: #H1; nrewrite > (neq_to_neqc ⦠H1); nnormalize; napply refl_eq + ##| ##2: #H1; nrewrite > (neq_to_neqc ⦠H1); + nrewrite > (symmetric_andbool (eqc ? s1 s2) false); + nnormalize; napply refl_eq + ##] +nqed. + +nlemma strid_is_comparable : comparable. + napply (mk_comparable strId); + ##[ napply (mk_strId (nil ?) O) + ##| napply (λx.false) + ##| napply eq_strId + ##| napply eqstrid_to_eq + ##| napply eq_to_eqstrid + ##| napply neqstrid_to_neq + ##| napply neq_to_neqstrid + ##| napply decidable_strid + ##| napply symmetric_eqstrid + ##] +nqed. + +unification hint 0 â ⢠carr strid_is_comparable â¡ strId. diff --git a/helm/software/matita/contribs/ng_assembly2/common/theory.ma b/helm/software/matita/contribs/ng_assembly2/common/theory.ma new file mode 100644 index 000000000..da7812069 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/common/theory.ma @@ -0,0 +1,608 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/pts.ma". + +(* ********************************** *) +(* SOTTOINSIEME MINIMALE DELLA TEORIA *) +(* ********************************** *) + +(* logic/connectives.ma *) + +ninductive True: Prop â + I : True. + +ninductive False: Prop â. + +ndefinition Not: Prop â Prop â +λA.(A â False). + +interpretation "logical not" 'not x = (Not x). + +nlemma absurd : âA,C:Prop.A â ¬A â C. + #A; #C; #H; + nnormalize; + #H1; + nelim (H1 H). +nqed. + +nlemma not_to_not : âA,B:Prop. (A â B) â ((¬B) â (¬A)). + #A; #B; #H; + nnormalize; + #H1; #H2; + nelim (H1 (H H2)). +nqed. + +nlemma prop_to_nnprop : âP.P â ¬¬P. + #P; nnormalize; #H; #H1; + napply (H1 H). +nqed. + +ninductive And2 (A,B:Prop) : Prop â + conj2 : A â B â (And2 A B). + +interpretation "logical and" 'and x y = (And2 x y). + +nlemma proj2_1: âA,B:Prop.A ⧠B â A. + #A; #B; #H; + napply (And2_ind A B ⦠H); + #H1; #H2; + napply H1. +nqed. + +nlemma proj2_2: âA,B:Prop.A ⧠B â B. + #A; #B; #H; + napply (And2_ind A B ⦠H); + #H1; #H2; + napply H2. +nqed. + +ninductive And3 (A,B,C:Prop) : Prop â + conj3 : A â B â C â (And3 A B C). + +nlemma proj3_1: âA,B,C:Prop.And3 A B C â A. + #A; #B; #C; #H; + napply (And3_ind A B C ⦠H); + #H1; #H2; #H3; + napply H1. +nqed. + +nlemma proj3_2: âA,B,C:Prop.And3 A B C â B. + #A; #B; #C; #H; + napply (And3_ind A B C ⦠H); + #H1; #H2; #H3; + napply H2. +nqed. + +nlemma proj3_3: âA,B,C:Prop.And3 A B C â C. + #A; #B; #C; #H; + napply (And3_ind A B C ⦠H); + #H1; #H2; #H3; + napply H3. +nqed. + +ninductive And4 (A,B,C,D:Prop) : Prop â + conj4 : A â B â C â D â (And4 A B C D). + +nlemma proj4_1: âA,B,C,D:Prop.And4 A B C D â A. + #A; #B; #C; #D; #H; + napply (And4_ind A B C D ⦠H); + #H1; #H2; #H3; #H4; + napply H1. +nqed. + +nlemma proj4_2: âA,B,C,D:Prop.And4 A B C D â B. + #A; #B; #C; #D; #H; + napply (And4_ind A B C D ⦠H); + #H1; #H2; #H3; #H4; + napply H2. +nqed. + +nlemma proj4_3: âA,B,C,D:Prop.And4 A B C D â C. + #A; #B; #C; #D; #H; + napply (And4_ind A B C D ⦠H); + #H1; #H2; #H3; #H4; + napply H3. +nqed. + +nlemma proj4_4: âA,B,C,D:Prop.And4 A B C D â D. + #A; #B; #C; #D; #H; + napply (And4_ind A B C D ⦠H); + #H1; #H2; #H3; #H4; + napply H4. +nqed. + +ninductive And5 (A,B,C,D,E:Prop) : Prop â + conj5 : A â B â C â D â E â (And5 A B C D E). + +nlemma proj5_1: âA,B,C,D,E:Prop.And5 A B C D E â A. + #A; #B; #C; #D; #E; #H; + napply (And5_ind A B C D E ⦠H); + #H1; #H2; #H3; #H4; #H5; + napply H1. +nqed. + +nlemma proj5_2: âA,B,C,D,E:Prop.And5 A B C D E â B. + #A; #B; #C; #D; #E; #H; + napply (And5_ind A B C D E ⦠H); + #H1; #H2; #H3; #H4; #H5; + napply H2. +nqed. + +nlemma proj5_3: âA,B,C,D,E:Prop.And5 A B C D E â C. + #A; #B; #C; #D; #E; #H; + napply (And5_ind A B C D E ⦠H); + #H1; #H2; #H3; #H4; #H5; + napply H3. +nqed. + +nlemma proj5_4: âA,B,C,D,E:Prop.And5 A B C D E â D. + #A; #B; #C; #D; #E; #H; + napply (And5_ind A B C D E ⦠H); + #H1; #H2; #H3; #H4; #H5; + napply H4. +nqed. + +nlemma proj5_5: âA,B,C,D,E:Prop.And5 A B C D E â E. + #A; #B; #C; #D; #E; #H; + napply (And5_ind A B C D E ⦠H); + #H1; #H2; #H3; #H4; #H5; + napply H5. +nqed. + +ninductive Or2 (A,B:Prop) : Prop â + or2_intro1 : A â (Or2 A B) +| or2_intro2 : B â (Or2 A B). + +interpretation "logical or" 'or x y = (Or2 x y). + +ndefinition decidable â λA:Prop.A ⨠(¬A). + +nlemma or2_elim + : âP1,P2,Q:Prop.Or2 P1 P2 â âf1:P1 â Q.âf2:P2 â Q.Q. + #P1; #P2; #Q; #H; #f1; #f2; + napply (Or2_ind P1 P2 ? f1 f2 ?); + napply H. +nqed. + +nlemma symmetric_or2 : âP1,P2.Or2 P1 P2 â Or2 P2 P1. + #P1; #P2; #H; + napply (or2_elim P1 P2 ? H); + ##[ ##1: #H1; napply (or2_intro2 P2 P1 H1) + ##| ##2: #H1; napply (or2_intro1 P2 P1 H1) + ##] +nqed. + +ninductive Or3 (A,B,C:Prop) : Prop â + or3_intro1 : A â (Or3 A B C) +| or3_intro2 : B â (Or3 A B C) +| or3_intro3 : C â (Or3 A B C). + +nlemma or3_elim + : âP1,P2,P3,Q:Prop.Or3 P1 P2 P3 â âf1:P1 â Q.âf2:P2 â Q.âf3:P3 â Q.Q. + #P1; #P2; #P3; #Q; #H; #f1; #f2; #f3; + napply (Or3_ind P1 P2 P3 ? f1 f2 f3 ?); + napply H. +nqed. + +nlemma symmetric_or3_12 : âP1,P2,P3:Prop.Or3 P1 P2 P3 â Or3 P2 P1 P3. + #P1; #P2; #P3; #H; + napply (or3_elim P1 P2 P3 ? H); + ##[ ##1: #H1; napply (or3_intro2 P2 P1 P3 H1) + ##| ##2: #H1; napply (or3_intro1 P2 P1 P3 H1) + ##| ##3: #H1; napply (or3_intro3 P2 P1 P3 H1) + ##] +nqed. + +nlemma symmetric_or3_13 : âP1,P2,P3:Prop.Or3 P1 P2 P3 â Or3 P3 P2 P1. + #P1; #P2; #P3; #H; + napply (or3_elim P1 P2 P3 ? H); + ##[ ##1: #H1; napply (or3_intro3 P3 P2 P1 H1) + ##| ##2: #H1; napply (or3_intro2 P3 P2 P1 H1) + ##| ##3: #H1; napply (or3_intro1 P3 P2 P1 H1) + ##] +nqed. + +nlemma symmetric_or3_23 : âP1,P2,P3:Prop.Or3 P1 P2 P3 â Or3 P1 P3 P2. + #P1; #P2; #P3; #H; + napply (or3_elim P1 P2 P3 ? H); + ##[ ##1: #H1; napply (or3_intro1 P1 P3 P2 H1) + ##| ##2: #H1; napply (or3_intro3 P1 P3 P2 H1) + ##| ##3: #H1; napply (or3_intro2 P1 P3 P2 H1) + ##] +nqed. + +ninductive Or4 (A,B,C,D:Prop) : Prop â + or4_intro1 : A â (Or4 A B C D) +| or4_intro2 : B â (Or4 A B C D) +| or4_intro3 : C â (Or4 A B C D) +| or4_intro4 : D â (Or4 A B C D). + +nlemma or4_elim + : âP1,P2,P3,P4,Q:Prop.Or4 P1 P2 P3 P4 â âf1:P1 â Q.âf2:P2 â Q. + âf3:P3 â Q.âf4:P4 â Q.Q. + #P1; #P2; #P3; #P4; #Q; #H; #f1; #f2; #f3; #f4; + napply (Or4_ind P1 P2 P3 P4 ? f1 f2 f3 f4 ?); + napply H. +nqed. + +nlemma symmetric_or4_12 : âP1,P2,P3,P4:Prop.Or4 P1 P2 P3 P4 â Or4 P2 P1 P3 P4. + #P1; #P2; #P3; #P4; #H; + napply (or4_elim P1 P2 P3 P4 ? H); + ##[ ##1: #H1; napply (or4_intro2 P2 P1 P3 P4 H1) + ##| ##2: #H1; napply (or4_intro1 P2 P1 P3 P4 H1) + ##| ##3: #H1; napply (or4_intro3 P2 P1 P3 P4 H1) + ##| ##4: #H1; napply (or4_intro4 P2 P1 P3 P4 H1) + ##] +nqed. + +nlemma symmetric_or4_13 : âP1,P2,P3,P4:Prop.Or4 P1 P2 P3 P4 â Or4 P3 P2 P1 P4. + #P1; #P2; #P3; #P4; #H; + napply (or4_elim P1 P2 P3 P4 ? H); + ##[ ##1: #H1; napply (or4_intro3 P3 P2 P1 P4 H1) + ##| ##2: #H1; napply (or4_intro2 P3 P2 P1 P4 H1) + ##| ##3: #H1; napply (or4_intro1 P3 P2 P1 P4 H1) + ##| ##4: #H1; napply (or4_intro4 P3 P2 P1 P4 H1) + ##] +nqed. + +nlemma symmetric_or4_14 : âP1,P2,P3,P4:Prop.Or4 P1 P2 P3 P4 â Or4 P4 P2 P3 P1. + #P1; #P2; #P3; #P4; #H; + napply (or4_elim P1 P2 P3 P4 ? H); + ##[ ##1: #H1; napply (or4_intro4 P4 P2 P3 P1 H1) + ##| ##2: #H1; napply (or4_intro2 P4 P2 P3 P1 H1) + ##| ##3: #H1; napply (or4_intro3 P4 P2 P3 P1 H1) + ##| ##4: #H1; napply (or4_intro1 P4 P2 P3 P1 H1) + ##] +nqed. + +nlemma symmetric_or4_23 : âP1,P2,P3,P4:Prop.Or4 P1 P2 P3 P4 â Or4 P1 P3 P2 P4. + #P1; #P2; #P3; #P4; #H; + napply (or4_elim P1 P2 P3 P4 ? H); + ##[ ##1: #H1; napply (or4_intro1 P1 P3 P2 P4 H1) + ##| ##2: #H1; napply (or4_intro3 P1 P3 P2 P4 H1) + ##| ##3: #H1; napply (or4_intro2 P1 P3 P2 P4 H1) + ##| ##4: #H1; napply (or4_intro4 P1 P3 P2 P4 H1) + ##] +nqed. + +nlemma symmetric_or4_24 : âP1,P2,P3,P4:Prop.Or4 P1 P2 P3 P4 â Or4 P1 P4 P3 P2. + #P1; #P2; #P3; #P4; #H; + napply (or4_elim P1 P2 P3 P4 ? H); + ##[ ##1: #H1; napply (or4_intro1 P1 P4 P3 P2 H1) + ##| ##2: #H1; napply (or4_intro4 P1 P4 P3 P2 H1) + ##| ##3: #H1; napply (or4_intro3 P1 P4 P3 P2 H1) + ##| ##4: #H1; napply (or4_intro2 P1 P4 P3 P2 H1) + ##] +nqed. + +nlemma symmetric_or4_34 : âP1,P2,P3,P4:Prop.Or4 P1 P2 P3 P4 â Or4 P1 P2 P4 P3. + #P1; #P2; #P3; #P4; #H; + napply (or4_elim P1 P2 P3 P4 ? H); + ##[ ##1: #H1; napply (or4_intro1 P1 P2 P4 P3 H1) + ##| ##2: #H1; napply (or4_intro2 P1 P2 P4 P3 H1) + ##| ##3: #H1; napply (or4_intro4 P1 P2 P4 P3 H1) + ##| ##4: #H1; napply (or4_intro3 P1 P2 P4 P3 H1) + ##] +nqed. + +ninductive Or5 (A,B,C,D,E:Prop) : Prop â + or5_intro1 : A â (Or5 A B C D E) +| or5_intro2 : B â (Or5 A B C D E) +| or5_intro3 : C â (Or5 A B C D E) +| or5_intro4 : D â (Or5 A B C D E) +| or5_intro5 : E â (Or5 A B C D E). + +nlemma or5_elim + : âP1,P2,P3,P4,P5,Q:Prop.Or5 P1 P2 P3 P4 P5 â âf1:P1 â Q.âf2:P2 â Q. + âf3:P3 â Q.âf4:P4 â Q.âf5:P5 â Q.Q. + #P1; #P2; #P3; #P4; #P5; #Q; #H; #f1; #f2; #f3; #f4; #f5; + napply (Or5_ind P1 P2 P3 P4 P5 ? f1 f2 f3 f4 f5 ?); + napply H. +nqed. + +nlemma symmetric_or5_12 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P2 P1 P3 P4 P5. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro2 P2 P1 P3 P4 P5 H1) + ##| ##2: #H1; napply (or5_intro1 P2 P1 P3 P4 P5 H1) + ##| ##3: #H1; napply (or5_intro3 P2 P1 P3 P4 P5 H1) + ##| ##4: #H1; napply (or5_intro4 P2 P1 P3 P4 P5 H1) + ##| ##5: #H1; napply (or5_intro5 P2 P1 P3 P4 P5 H1) + ##] +nqed. + +nlemma symmetric_or5_13 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P3 P2 P1 P4 P5. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro3 P3 P2 P1 P4 P5 H1) + ##| ##2: #H1; napply (or5_intro2 P3 P2 P1 P4 P5 H1) + ##| ##3: #H1; napply (or5_intro1 P3 P2 P1 P4 P5 H1) + ##| ##4: #H1; napply (or5_intro4 P3 P2 P1 P4 P5 H1) + ##| ##5: #H1; napply (or5_intro5 P3 P2 P1 P4 P5 H1) + ##] +nqed. + +nlemma symmetric_or5_14 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P4 P2 P3 P1 P5. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro4 P4 P2 P3 P1 P5 H1) + ##| ##2: #H1; napply (or5_intro2 P4 P2 P3 P1 P5 H1) + ##| ##3: #H1; napply (or5_intro3 P4 P2 P3 P1 P5 H1) + ##| ##4: #H1; napply (or5_intro1 P4 P2 P3 P1 P5 H1) + ##| ##5: #H1; napply (or5_intro5 P4 P2 P3 P1 P5 H1) + ##] +nqed. + +nlemma symmetric_or5_15 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P5 P2 P3 P4 P1. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro5 P5 P2 P3 P4 P1 H1) + ##| ##2: #H1; napply (or5_intro2 P5 P2 P3 P4 P1 H1) + ##| ##3: #H1; napply (or5_intro3 P5 P2 P3 P4 P1 H1) + ##| ##4: #H1; napply (or5_intro4 P5 P2 P3 P4 P1 H1) + ##| ##5: #H1; napply (or5_intro1 P5 P2 P3 P4 P1 H1) + ##] +nqed. + +nlemma symmetric_or5_23 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P1 P3 P2 P4 P5. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro1 P1 P3 P2 P4 P5 H1) + ##| ##2: #H1; napply (or5_intro3 P1 P3 P2 P4 P5 H1) + ##| ##3: #H1; napply (or5_intro2 P1 P3 P2 P4 P5 H1) + ##| ##4: #H1; napply (or5_intro4 P1 P3 P2 P4 P5 H1) + ##| ##5: #H1; napply (or5_intro5 P1 P3 P2 P4 P5 H1) + ##] +nqed. + +nlemma symmetric_or5_24 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P1 P4 P3 P2 P5. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro1 P1 P4 P3 P2 P5 H1) + ##| ##2: #H1; napply (or5_intro4 P1 P4 P3 P2 P5 H1) + ##| ##3: #H1; napply (or5_intro3 P1 P4 P3 P2 P5 H1) + ##| ##4: #H1; napply (or5_intro2 P1 P4 P3 P2 P5 H1) + ##| ##5: #H1; napply (or5_intro5 P1 P4 P3 P2 P5 H1) + ##] +nqed. + +nlemma symmetric_or5_25 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P1 P5 P3 P4 P2. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro1 P1 P5 P3 P4 P2 H1) + ##| ##2: #H1; napply (or5_intro5 P1 P5 P3 P4 P2 H1) + ##| ##3: #H1; napply (or5_intro3 P1 P5 P3 P4 P2 H1) + ##| ##4: #H1; napply (or5_intro4 P1 P5 P3 P4 P2 H1) + ##| ##5: #H1; napply (or5_intro2 P1 P5 P3 P4 P2 H1) + ##] +nqed. + +nlemma symmetric_or5_34 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P1 P2 P4 P3 P5. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro1 P1 P2 P4 P3 P5 H1) + ##| ##2: #H1; napply (or5_intro2 P1 P2 P4 P3 P5 H1) + ##| ##3: #H1; napply (or5_intro4 P1 P2 P4 P3 P5 H1) + ##| ##4: #H1; napply (or5_intro3 P1 P2 P4 P3 P5 H1) + ##| ##5: #H1; napply (or5_intro5 P1 P2 P4 P3 P5 H1) + ##] +nqed. + +nlemma symmetric_or5_35 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P1 P2 P5 P4 P3. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro1 P1 P2 P5 P4 P3 H1) + ##| ##2: #H1; napply (or5_intro2 P1 P2 P5 P4 P3 H1) + ##| ##3: #H1; napply (or5_intro5 P1 P2 P5 P4 P3 H1) + ##| ##4: #H1; napply (or5_intro4 P1 P2 P5 P4 P3 H1) + ##| ##5: #H1; napply (or5_intro3 P1 P2 P5 P4 P3 H1) + ##] +nqed. + +nlemma symmetric_or5_45 : âP1,P2,P3,P4,P5:Prop.Or5 P1 P2 P3 P4 P5 â Or5 P1 P2 P3 P5 P4. + #P1; #P2; #P3; #P4; #P5; #H; + napply (or5_elim P1 P2 P3 P4 P5 ? H); + ##[ ##1: #H1; napply (or5_intro1 P1 P2 P3 P5 P4 H1) + ##| ##2: #H1; napply (or5_intro2 P1 P2 P3 P5 P4 H1) + ##| ##3: #H1; napply (or5_intro3 P1 P2 P3 P5 P4 H1) + ##| ##4: #H1; napply (or5_intro5 P1 P2 P3 P5 P4 H1) + ##| ##5: #H1; napply (or5_intro4 P1 P2 P3 P5 P4 H1) + ##] +nqed. + +ninductive ex (A:Type) (Q:A â Prop) : Prop â + ex_intro: âx:A.Q x â ex A Q. + +interpretation "exists" 'exists x = (ex ? x). + +ninductive ex2 (A:Type) (Q,R:A â Prop) : Prop â + ex_intro2: âx:A.Q x â R x â ex2 A Q R. + +(* higher_order_defs/relations *) + +ndefinition relation : Type â Type â +λA.A â A â Prop. + +ndefinition reflexive : âA:Type.âR:relation A.Prop â +λA.λR.âx:A.R x x. + +ndefinition symmetric : âA:Type.âR:relation A.Prop â +λA.λR.âx,y:A.R x y â R y x. + +ndefinition transitive : âA:Type.âR:relation A.Prop â +λA.λR.âx,y,z:A.R x y â R y z â R x z. + +ndefinition irreflexive : âA:Type.âR:relation A.Prop â +λA.λR.âx:A.¬ (R x x). + +ndefinition cotransitive : âA:Type.âR:relation A.Prop â +λA.λR.âx,y:A.R x y â âz:A. R x z ⨠R z y. + +ndefinition tight_apart : âA:Type.âeq,ap:relation A.Prop â +λA.λeq,ap.âx,y:A. (¬ (ap x y) â eq x y) ⧠(eq x y â ¬ (ap x y)). + +ndefinition antisymmetric : âA:Type.âR:relation A.Prop â +λA.λR.âx,y:A.R x y â ¬ (R y x). + +(* logic/equality.ma *) + +ninductive eq (A:Type) (x:A) : A â Prop â + refl_eq : eq A x x. + +ndefinition refl â refl_eq. + +interpretation "leibnitz's equality" 'eq t x y = (eq t x y). + +interpretation "leibnitz's non-equality" 'neq t x y = (Not (eq t x y)). + +nlemma eq_f : âT1,T2:Type.âx,y:T1.âf:T1 â T2.x = y â (f x) = (f y). + #T1; #T2; #x; #y; #f; #H; + nrewrite < H; + napply refl_eq. +nqed. + +nlemma eq_f2 : âT1,T2,T3:Type.âx1,y1:T1.âx2,y2:T2.âf:T1 â T2 â T3.x1 = y1 â x2 = y2 â f x1 x2 = f y1 y2. + #T1; #T2; #T3; #x1; #y1; #x2; #y2; #f; #H1; #H2; + nrewrite < H1; + nrewrite < H2; + napply refl_eq. +nqed. + +nlemma neqf_to_neq : âT1,T2:Type.âx,y:T1.âf:T1 â T2.((f x) â (f y)) â x â y. + #T1; #T2; #x; #y; #f; + nnormalize; #H; #H1; + napply (H (eq_f ⦠H1)). +nqed. + +nlemma symmetric_eq: âA:Type. symmetric A (eq A). + #A; + nnormalize; + #x; #y; #H; + nrewrite < H; + napply refl_eq. +nqed. + +nlemma eq_ind_r: âA:Type[0].âx:A.âP:A â Prop.P x â ây:A.y=x â P y. + #A; #x; #P; #H; #y; #H1; + nrewrite < (symmetric_eq ⦠H1); + napply H. +nqed. + +ndefinition R0 â λT:Type[0].λt:T.t. + +ndefinition R1 â eq_rect_Type0. + +ndefinition R2 : + âT0:Type[0]. + âa0:T0. + âT1:âx0:T0. a0=x0 â Type[0]. + âa1:T1 a0 (refl_eq ? a0). + âT2:âx0:T0. âp0:a0=x0. âx1:T1 x0 p0. R1 ?? T1 a1 ? p0 = x1 â Type[0]. + âa2:T2 a0 (refl_eq ? a0) a1 (refl_eq ? a1). + âb0:T0. + âe0:a0 = b0. + âb1: T1 b0 e0. + âe1:R1 ?? T1 a1 ? e0 = b1. + T2 b0 e0 b1 e1. + #T0;#a0;#T1;#a1;#T2;#a2;#b0;#e0;#b1;#e1; + napply (eq_rect_Type0 ????? e1); + napply (R1 ?? ? ?? e0); + napply a2; +nqed. + +ndefinition R3 : + âT0:Type[0]. + âa0:T0. + âT1:âx0:T0. a0=x0 â Type[0]. + âa1:T1 a0 (refl_eq ? a0). + âT2:âx0:T0. âp0:a0=x0. âx1:T1 x0 p0. R1 ?? T1 a1 ? p0 = x1 â Type[0]. + âa2:T2 a0 (refl_eq ? a0) a1 (refl_eq ? a1). + âT3:âx0:T0. âp0:a0=x0. âx1:T1 x0 p0.âp1:R1 ?? T1 a1 ? p0 = x1. + âx2:T2 x0 p0 x1 p1.R2 ???? T2 a2 x0 p0 ? p1 = x2 â Type[0]. + âa3:T3 a0 (refl_eq ? a0) a1 (refl_eq ? a1) a2 (refl_eq ? a2). + âb0:T0. + âe0:a0 = b0. + âb1: T1 b0 e0. + âe1:R1 ?? T1 a1 ? e0 = b1. + âb2: T2 b0 e0 b1 e1. + âe2:R2 ???? T2 a2 b0 e0 ? e1 = b2. + T3 b0 e0 b1 e1 b2 e2. + #T0;#a0;#T1;#a1;#T2;#a2;#T3;#a3;#b0;#e0;#b1;#e1;#b2;#e2; + napply (eq_rect_Type0 ????? e2); + napply (R2 ?? ? ???? e0 ? e1); + napply a3; +nqed. + +ndefinition R4 : + âT0:Type[0]. + âa0:T0. + âT1:âx0:T0. eq T0 a0 x0 â Type[0]. + âa1:T1 a0 (refl_eq T0 a0). + âT2:âx0:T0. âp0:eq (T0 â¦) a0 x0. âx1:T1 x0 p0.eq (T1 â¦) (R1 T0 a0 T1 a1 x0 p0) x1 â Type[0]. + âa2:T2 a0 (refl_eq T0 a0) a1 (refl_eq (T1 a0 (refl_eq T0 a0)) a1). + âT3:âx0:T0. âp0:eq (T0 â¦) a0 x0. âx1:T1 x0 p0.âp1:eq (T1 â¦) (R1 T0 a0 T1 a1 x0 p0) x1. + âx2:T2 x0 p0 x1 p1.eq (T2 â¦) (R2 T0 a0 T1 a1 T2 a2 x0 p0 x1 p1) x2 â Type[0]. + âa3:T3 a0 (refl_eq T0 a0) a1 (refl_eq (T1 a0 (refl_eq T0 a0)) a1) + a2 (refl_eq (T2 a0 (refl_eq T0 a0) a1 (refl_eq (T1 a0 (refl_eq T0 a0)) a1)) a2). + âT4:âx0:T0. âp0:eq (T0 â¦) a0 x0. âx1:T1 x0 p0.âp1:eq (T1 â¦) (R1 T0 a0 T1 a1 x0 p0) x1. + âx2:T2 x0 p0 x1 p1.âp2:eq (T2 â¦) (R2 T0 a0 T1 a1 T2 a2 x0 p0 x1 p1) x2. + âx3:T3 x0 p0 x1 p1 x2 p2.âp3:eq (T3 â¦) (R3 T0 a0 T1 a1 T2 a2 T3 a3 x0 p0 x1 p1 x2 p2) x3. + Type[0]. + âa4:T4 a0 (refl_eq T0 a0) a1 (refl_eq (T1 a0 (refl_eq T0 a0)) a1) + a2 (refl_eq (T2 a0 (refl_eq T0 a0) a1 (refl_eq (T1 a0 (refl_eq T0 a0)) a1)) a2) + a3 (refl_eq (T3 a0 (refl_eq T0 a0) a1 (refl_eq (T1 a0 (refl_eq T0 a0)) a1) + a2 (refl_eq (T2 a0 (refl_eq T0 a0) a1 (refl_eq (T1 a0 (refl_eq T0 a0)) a1)) a2)) + a3). + âb0:T0. + âe0:eq (T0 â¦) a0 b0. + âb1: T1 b0 e0. + âe1:eq (T1 â¦) (R1 T0 a0 T1 a1 b0 e0) b1. + âb2: T2 b0 e0 b1 e1. + âe2:eq (T2 â¦) (R2 T0 a0 T1 a1 T2 a2 b0 e0 b1 e1) b2. + âb3: T3 b0 e0 b1 e1 b2 e2. + âe3:eq (T3 â¦) (R3 T0 a0 T1 a1 T2 a2 T3 a3 b0 e0 b1 e1 b2 e2) b3. + T4 b0 e0 b1 e1 b2 e2 b3 e3. + #T0;#a0;#T1;#a1;#T2;#a2;#T3;#a3;#T4;#a4;#b0;#e0;#b1;#e1;#b2;#e2;#b3;#e3; + napply (eq_rect_Type0 ????? e3); + napply (R3 ????????? e0 ? e1 ? e2); + napply a4; +nqed. + +naxiom streicherK : âT:Type[0].ât:T.âP:t = t â Type[2].P (refl ? t) â âp.P p. + +nlemma symmetric_neq : âT:Type.âx,y:T.x â y â y â x. + #T; #x; #y; + nnormalize; + #H; #H1; + nrewrite > H1 in H:(%); #H; + napply (H (refl_eq â¦)). +nqed. + +ndefinition relationT : Type â Type â Type â +λA,T:Type.A â A â T. + +ndefinition symmetricT: âA,T:Type.âR:relationT A T.Prop â +λA,T.λR.âx,y:A.R x y = R y x. + +ndefinition associative : âA:Type.âR:relationT A A.Prop â +λA.λR.âx,y,z:A.R (R x y) z = R x (R y z). diff --git a/helm/software/matita/contribs/ng_assembly2/depends b/helm/software/matita/contribs/ng_assembly2/depends new file mode 100644 index 000000000..cadd99a6a --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/depends @@ -0,0 +1,27 @@ +common/nat.ma common/comp.ma num/bool_lemmas.ma +num/word32.ma num/word16.ma +common/ascii_base.ma num/bool.ma +num/bitrigesim.ma common/comp.ma num/bool_lemmas.ma +common/pts.ma +common/prod.ma common/comp.ma common/prod_base.ma num/bool_lemmas.ma +common/prod_base.ma num/bool.ma +universe/universe.ma common/nelist.ma common/prod.ma +num/bool_lemmas.ma num/bool.ma +common/comp.ma common/hints_declaration.ma num/bool.ma +num/exadecim.ma num/bool_lemmas.ma num/comp_ext.ma num/oct.ma +num/word24.ma num/byte8.ma +common/theory.ma common/pts.ma +common/sigma.ma common/theory.ma +num/oct.ma common/comp.ma num/bool_lemmas.ma +common/hints_declaration.ma common/pts.ma +num/byte8.ma num/bitrigesim.ma num/comp_num.ma num/exadecim.ma +common/option.ma common/comp.ma common/option_base.ma num/bool_lemmas.ma +num/bool.ma common/theory.ma +common/option_base.ma num/bool.ma +num/word16.ma common/nat.ma num/byte8.ma +common/string.ma common/ascii.ma common/list.ma +common/ascii.ma common/ascii_base.ma common/comp.ma num/bool_lemmas.ma +common/list.ma common/comp.ma common/nat.ma common/option.ma +num/comp_num.ma num/bool_lemmas.ma num/comp_ext.ma +num/comp_ext.ma common/comp.ma common/prod.ma +common/nelist.ma common/list.ma diff --git a/helm/software/matita/contribs/ng_assembly2/num/bitrigesim.ma b/helm/software/matita/contribs/ng_assembly2/num/bitrigesim.ma new file mode 100755 index 000000000..82c14bdc2 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/bitrigesim.ma @@ -0,0 +1,262 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/comp.ma". +include "num/bool_lemmas.ma". + +(* ************* *) +(* BITRIGESIMALI *) +(* ************* *) + +ninductive bitrigesim : Type â + t00: bitrigesim +| t01: bitrigesim +| t02: bitrigesim +| t03: bitrigesim +| t04: bitrigesim +| t05: bitrigesim +| t06: bitrigesim +| t07: bitrigesim +| t08: bitrigesim +| t09: bitrigesim +| t0A: bitrigesim +| t0B: bitrigesim +| t0C: bitrigesim +| t0D: bitrigesim +| t0E: bitrigesim +| t0F: bitrigesim +| t10: bitrigesim +| t11: bitrigesim +| t12: bitrigesim +| t13: bitrigesim +| t14: bitrigesim +| t15: bitrigesim +| t16: bitrigesim +| t17: bitrigesim +| t18: bitrigesim +| t19: bitrigesim +| t1A: bitrigesim +| t1B: bitrigesim +| t1C: bitrigesim +| t1D: bitrigesim +| t1E: bitrigesim +| t1F: bitrigesim. + +(* operatore = *) +ndefinition eq_bit â +λt1,t2:bitrigesim. + match t1 with + [ t00 â match t2 with [ t00 â true | _ â false ] | t01 â match t2 with [ t01 â true | _ â false ] + | t02 â match t2 with [ t02 â true | _ â false ] | t03 â match t2 with [ t03 â true | _ â false ] + | t04 â match t2 with [ t04 â true | _ â false ] | t05 â match t2 with [ t05 â true | _ â false ] + | t06 â match t2 with [ t06 â true | _ â false ] | t07 â match t2 with [ t07 â true | _ â false ] + | t08 â match t2 with [ t08 â true | _ â false ] | t09 â match t2 with [ t09 â true | _ â false ] + | t0A â match t2 with [ t0A â true | _ â false ] | t0B â match t2 with [ t0B â true | _ â false ] + | t0C â match t2 with [ t0C â true | _ â false ] | t0D â match t2 with [ t0D â true | _ â false ] + | t0E â match t2 with [ t0E â true | _ â false ] | t0F â match t2 with [ t0F â true | _ â false ] + | t10 â match t2 with [ t10 â true | _ â false ] | t11 â match t2 with [ t11 â true | _ â false ] + | t12 â match t2 with [ t12 â true | _ â false ] | t13 â match t2 with [ t13 â true | _ â false ] + | t14 â match t2 with [ t14 â true | _ â false ] | t15 â match t2 with [ t15 â true | _ â false ] + | t16 â match t2 with [ t16 â true | _ â false ] | t17 â match t2 with [ t17 â true | _ â false ] + | t18 â match t2 with [ t18 â true | _ â false ] | t19 â match t2 with [ t19 â true | _ â false ] + | t1A â match t2 with [ t1A â true | _ â false ] | t1B â match t2 with [ t1B â true | _ â false ] + | t1C â match t2 with [ t1C â true | _ â false ] | t1D â match t2 with [ t1D â true | _ â false ] + | t1E â match t2 with [ t1E â true | _ â false ] | t1F â match t2 with [ t1F â true | _ â false ] + ]. + +(* iteratore sui bitrigesimali *) +ndefinition forall_bit â λP. + P t00 â P t01 â P t02 â P t03 â P t04 â P t05 â P t06 â P t07 â + P t08 â P t09 â P t0A â P t0B â P t0C â P t0D â P t0E â P t0F â + P t10 â P t11 â P t12 â P t13 â P t14 â P t15 â P t16 â P t17 â + P t18 â P t19 â P t1A â P t1B â P t1C â P t1D â P t1E â P t1F. + +(* operatore successore *) +ndefinition succ_bit â +λn.match n with + [ t00 â t01 | t01 â t02 | t02 â t03 | t03 â t04 | t04 â t05 | t05 â t06 | t06 â t07 | t07 â t08 + | t08 â t09 | t09 â t0A | t0A â t0B | t0B â t0C | t0C â t0D | t0D â t0E | t0E â t0F | t0F â t10 + | t10 â t11 | t11 â t12 | t12 â t13 | t13 â t14 | t14 â t15 | t15 â t16 | t16 â t17 | t17 â t18 + | t18 â t19 | t19 â t1A | t1A â t1B | t1B â t1C | t1C â t1D | t1D â t1E | t1E â t1F | t1F â t00 + ]. + +(* bitrigesimali ricorsivi *) +ninductive rec_bitrigesim : bitrigesim â Type â + bi_O : rec_bitrigesim t00 +| bi_S : ân.rec_bitrigesim n â rec_bitrigesim (succ_bit n). + +(* bitrigesimali â bitrigesimali ricorsivi *) +ndefinition bit_to_recbit â +λn.match n return λx.rec_bitrigesim x with + [ t00 â bi_O + | t01 â bi_S ? bi_O + | t02 â bi_S ? (bi_S ? bi_O) + | t03 â bi_S ? (bi_S ? (bi_S ? bi_O)) + | t04 â bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))) + | t05 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))) + | t06 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))))) + | t07 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))))) + | t08 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + bi_O))))))) + | t09 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? bi_O)))))))) + | t0A â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? bi_O))))))))) + | t0B â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))) + | t0C â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))))))))))) + | t0D â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))) + | t0E â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))))))))))))) + | t0F â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))))) + | t10 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + bi_O))))))))))))))) + | t11 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? bi_O)))))))))))))))) + | t12 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? bi_O))))))))))))))))) + | t13 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))))))))) + | t14 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))))))))))))))))))) + | t15 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))))))))))) + | t16 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))))))))))))))))))))) + | t17 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))))))))))))) + | t18 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + bi_O))))))))))))))))))))))) + | t19 â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? bi_O)))))))))))))))))))))))) + | t1A â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? bi_O))))))))))))))))))))))))) + | t1B â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))))))))))))))))) + | t1C â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))))))))))))))))))))))))))) + | t1D â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))))))))))))))))))) + | t1E â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O))))))))))))))))))))))))))))) + | t1F â bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? + (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? (bi_S ? bi_O)))))))))))))))))))))))))))))) + ]. + +ndefinition bitrigesim_destruct_aux â +Î t1,t2:bitrigesim.Î P:Prop.t1 = t2 â + match eq_bit t1 t2 with [ true â P â P | false â P ]. + +ndefinition bitrigesim_destruct : bitrigesim_destruct_aux. + #t1; #t2; #P; #H; + nrewrite < H; + nelim t1; + nnormalize; + napply (λx.x). +nqed. + +nlemma eq_to_eqbit : ân1,n2.n1 = n2 â eq_bit n1 n2 = true. + #n1; #n2; #H; + nrewrite > H; + nelim n2; + nnormalize; + napply refl_eq. +nqed. + +nlemma neqbit_to_neq : ân1,n2.eq_bit n1 n2 = false â n1 â n2. + #n1; #n2; #H; + napply (not_to_not (n1 = n2) (eq_bit n1 n2 = true) â¦); + ##[ ##1: napply (eq_to_eqbit n1 n2) + ##| ##2: napply (eqfalse_to_neqtrue ⦠H) + ##] +nqed. + +(* !!! per brevita... *) +naxiom eqbit_to_eq : ât1,t2.eq_bit t1 t2 = true â t1 = t2. + +nlemma neq_to_neqbit : ân1,n2.n1 â n2 â eq_bit n1 n2 = false. + #n1; #n2; #H; + napply (neqtrue_to_eqfalse (eq_bit n1 n2)); + napply (not_to_not (eq_bit n1 n2 = true) (n1 = n2) ? H); + napply (eqbit_to_eq n1 n2). +nqed. + +nlemma decidable_bit : âx,y:bitrigesim.decidable (x = y). + #x; #y; nnormalize; + napply (or2_elim (eq_bit x y = true) (eq_bit x y = false) ? (decidable_bexpr ?)); + ##[ ##1: #H; napply (or2_intro1 (x = y) (x â y) (eqbit_to_eq ⦠H)) + ##| ##2: #H; napply (or2_intro2 (x = y) (x â y) (neqbit_to_neq ⦠H)) + ##] +nqed. + +nlemma symmetric_eqbit : symmetricT bitrigesim bool eq_bit. + #n1; #n2; + napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_bit n1 n2)); + ##[ ##1: #H; nrewrite > H; napply refl_eq + ##| ##2: #H; nrewrite > (neq_to_neqbit n1 n2 H); + napply (symmetric_eq ? (eq_bit n2 n1) false); + napply (neq_to_neqbit n2 n1 (symmetric_neq ? n1 n2 H)) + ##] +nqed. + +nlemma bitrigesim_is_comparable : comparable. + @ bitrigesim + ##[ napply t00 + ##| napply forall_bit + ##| napply eq_bit + ##| napply eqbit_to_eq + ##| napply eq_to_eqbit + ##| napply neqbit_to_neq + ##| napply neq_to_neqbit + ##| napply decidable_bit + ##| napply symmetric_eqbit + ##] +nqed. + +unification hint 0 â ⢠carr bitrigesim_is_comparable â¡ bitrigesim. diff --git a/helm/software/matita/contribs/ng_assembly2/num/bool.ma b/helm/software/matita/contribs/ng_assembly2/num/bool.ma new file mode 100755 index 000000000..8092713f2 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/bool.ma @@ -0,0 +1,78 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/theory.ma". + +(* ******** *) +(* BOOLEANI *) +(* ******** *) + +ninductive bool : Type â + true : bool +| false : bool. + +(* operatori booleani *) + +ndefinition eq_bool â +λb1,b2:bool.match b1 with + [ true â match b2 with [ true â true | false â false ] + | false â match b2 with [ true â false | false â true ] + ]. + +ndefinition not_bool â +λb:bool.match b with [ true â false | false â true ]. + +ndefinition and_bool â +λb1,b2:bool.match b1 with + [ true â b2 | false â false ]. + +ndefinition or_bool â +λb1,b2:bool.match b1 with + [ true â true | false â b2 ]. + +ndefinition xor_bool â +λb1,b2:bool.match b1 with + [ true â not_bool b2 + | false â b2 ]. + +(* \ominus *) +notation "hvbox(â a)" non associative with precedence 36 + for @{ 'not_bool $a }. +interpretation "not_bool" 'not_bool x = (not_bool x). + +(* \otimes *) +notation "hvbox(a break â b)" left associative with precedence 35 + for @{ 'and_bool $a $b }. +interpretation "and_bool" 'and_bool x y = (and_bool x y). + +(* \oplus *) +notation "hvbox(a break â b)" left associative with precedence 34 + for @{ 'or_bool $a $b }. +interpretation "or_bool" 'or_bool x y = (or_bool x y). + +(* \odot *) +notation "hvbox(a break â b)" left associative with precedence 33 + for @{ 'xor_bool $a $b }. +interpretation "xor_bool" 'xor_bool x y = (xor_bool x y). + +ndefinition boolRelation : Type â Type â +λA:Type.A â A â bool. diff --git a/helm/software/matita/contribs/ng_assembly2/num/bool_lemmas.ma b/helm/software/matita/contribs/ng_assembly2/num/bool_lemmas.ma new file mode 100755 index 000000000..660dd7e67 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/bool_lemmas.ma @@ -0,0 +1,322 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/bool.ma". + +(* ******** *) +(* BOOLEANI *) +(* ******** *) + +ndefinition bool_destruct_aux â +Î b1,b2:bool.Î P:Prop.b1 = b2 â + match eq_bool b1 b2 with [ true â P â P | false â P ]. + +ndefinition bool_destruct : bool_destruct_aux. + #b1; #b2; #P; #H; + nrewrite < H; + nelim b1; + nnormalize; + napply (λx.x). +nqed. + +nlemma symmetric_eqbool : symmetricT bool bool eq_bool. + #b1; #b2; + nelim b1; + nelim b2; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_andbool : symmetricT bool bool and_bool. + #b1; #b2; + nelim b1; + nelim b2; + nnormalize; + napply refl_eq. +nqed. + +nlemma associative_andbool : âb1,b2,b3.((b1 â b2) â b3) = (b1 â (b2 â b3)). + #b1; #b2; #b3; + nelim b1; + nelim b2; + nelim b3; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_orbool : symmetricT bool bool or_bool. + #b1; #b2; + nelim b1; + nelim b2; + nnormalize; + napply refl_eq. +nqed. + +nlemma associative_orbool : âb1,b2,b3.((b1 â b2) â b3) = (b1 â (b2 â b3)). + #b1; #b2; #b3; + nelim b1; + nelim b2; + nelim b3; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_xorbool : symmetricT bool bool xor_bool. + #b1; #b2; + nelim b1; + nelim b2; + nnormalize; + napply refl_eq. +nqed. + +nlemma associative_xorbool : âb1,b2,b3.((b1 â b2) â b3) = (b1 â (b2 â b3)). + #b1; #b2; #b3; + nelim b1; + nelim b2; + nelim b3; + nnormalize; + napply refl_eq. +nqed. + +nlemma eqbool_to_eq : âb1,b2:bool.(eq_bool b1 b2 = true) â (b1 = b2). + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##1,4: #H; napply refl_eq + ##| ##*: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma eq_to_eqbool : âb1,b2.b1 = b2 â eq_bool b1 b2 = true. + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##1,4: #H; napply refl_eq + ##| ##*: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma decidable_bool : âx,y:bool.decidable (x = y). + #x; #y; + nnormalize; + nelim x; + nelim y; + ##[ ##1,4: napply (or2_intro1 (? = ?) (? â ?) â¦); napply refl_eq + ##| ##*: napply (or2_intro2 (? = ?) (? â ?) â¦); + nnormalize; #H; + napply False_ind; + ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma decidable_bexpr : âx.(x = true) ⨠(x = false). + #x; ncases x; + ##[ ##1: napply (or2_intro1 (true = true) (true = false) (refl_eq â¦)) + ##| ##2: napply (or2_intro2 (false = true) (false = false) (refl_eq â¦)) + ##] +nqed. + +nlemma neqbool_to_neq : âb1,b2:bool.(eq_bool b1 b2 = false) â (b1 â b2). + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##1,4: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##| ##*: #H; #H1; ndestruct (*napply (bool_destruct ⦠H1)*) + ##] +nqed. + +nlemma neq_to_neqbool : âb1,b2.b1 â b2 â eq_bool b1 b2 = false. + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##1,4: #H; nelim (H (refl_eq â¦)) + ##| ##*: #H; napply refl_eq + ##] +nqed. + +nlemma eqfalse_to_neqtrue : âx.x = false â x â true. + #x; nelim x; + ##[ ##1: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##| ##2: #H; nnormalize; #H1; ndestruct (*napply (bool_destruct ⦠H1)*) + ##] +nqed. + +nlemma eqtrue_to_neqfalse : âx.x = true â x â false. + #x; nelim x; + ##[ ##1: #H; nnormalize; #H1; ndestruct (*napply (bool_destruct ⦠H1)*) + ##| ##2: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma neqfalse_to_eqtrue : âx.x â false â x = true. + #x; nelim x; + ##[ ##1: #H; napply refl_eq + ##| ##2: nnormalize; #H; nelim (H (refl_eq â¦)) + ##] +nqed. + +nlemma neqtrue_to_eqfalse : âx.x â true â x = false. + #x; nelim x; + ##[ ##1: nnormalize; #H; nelim (H (refl_eq â¦)) + ##| ##2: #H; napply refl_eq + ##] +nqed. + +nlemma andb_true_true_l: âb1,b2.(b1 â b2) = true â b1 = true. + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##1,2: #H; napply refl_eq + ##| ##*: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma andb_true_true_r: âb1,b2.(b1 â b2) = true â b2 = true. + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##1,3: #H; napply refl_eq + ##| ##*: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma andb_false2 + : âb1,b2.(b1 â b2) = false â + (b1 = false) ⨠(b2 = false). + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##1: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##| ##2,4: #H; napply (or2_intro2 ⦠H) + ##| ##3: #H; napply (or2_intro1 ⦠H) + ##] +nqed. + +nlemma andb_false3 + : âb1,b2,b3.(b1 â b2 â b3) = false â + Or3 (b1 = false) (b2 = false) (b3 = false). + #b1; #b2; #b3; + ncases b1; + ncases b2; + ncases b3; + nnormalize; + ##[ ##1: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##| ##5,6,7,8: #H; napply (or3_intro1 ⦠H) + ##| ##2,4: #H; napply (or3_intro3 ⦠H) + ##| ##3: #H; napply (or3_intro2 ⦠H) + ##] +nqed. + +nlemma andb_false4 + : âb1,b2,b3,b4.(b1 â b2 â b3 â b4) = false â + Or4 (b1 = false) (b2 = false) (b3 = false) (b4 = false). + #b1; #b2; #b3; #b4; + ncases b1; + ncases b2; + ncases b3; + ncases b4; + nnormalize; + ##[ ##1: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##| ##9,10,11,12,13,14,15,16: #H; napply (or4_intro1 ⦠H) + ##| ##5,6,7,8: #H; napply (or4_intro2 ⦠H) + ##| ##3,4: #H; napply (or4_intro3 ⦠H) + ##| ##2: #H; napply (or4_intro4 ⦠H) + ##] +nqed. + +nlemma andb_false5 + : âb1,b2,b3,b4,b5.(b1 â b2 â b3 â b4 â b5) = false â + Or5 (b1 = false) (b2 = false) (b3 = false) (b4 = false) (b5 = false). + #b1; #b2; #b3; #b4; #b5; + ncases b1; + ncases b2; + ncases b3; + ncases b4; + ncases b5; + nnormalize; + ##[ ##1: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##| ##17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32: #H; napply (or5_intro1 ⦠H) + ##| ##9,10,11,12,13,14,15,16: #H; napply (or5_intro2 ⦠H) + ##| ##5,6,7,8: #H; napply (or5_intro3 ⦠H) + ##| ##3,4: #H; napply (or5_intro4 ⦠H) + ##| ##2: #H; napply (or5_intro5 ⦠H) + ##] +nqed. + +nlemma andb_false2_1 : âb.(false â b) = false. + #b; nnormalize; napply refl_eq. nqed. +nlemma andb_false2_2 : âb.(b â false) = false. + #b; nelim b; nnormalize; napply refl_eq. nqed. + +nlemma andb_false3_1 : âb1,b2.(false â b1 â b2) = false. + #b1; #b2; nnormalize; napply refl_eq. nqed. +nlemma andb_false3_2 : âb1,b2.(b1 â false â b2) = false. + #b1; #b2; nelim b1; nnormalize; napply refl_eq. nqed. +nlemma andb_false3_3 : âb1,b2.(b1 â b2 â false) = false. + #b1; #b2; nelim b1; nelim b2; nnormalize; napply refl_eq. nqed. + +nlemma andb_false4_1 : âb1,b2,b3.(false â b1 â b2 â b3) = false. + #b1; #b2; #b3; nnormalize; napply refl_eq. nqed. +nlemma andb_false4_2 : âb1,b2,b3.(b1 â false â b2 â b3) = false. + #b1; #b2; #b3; nelim b1; nnormalize; napply refl_eq. nqed. +nlemma andb_false4_3 : âb1,b2,b3.(b1 â b2 â false â b3) = false. + #b1; #b2; #b3; nelim b1; nelim b2; nnormalize; napply refl_eq. nqed. +nlemma andb_false4_4 : âb1,b2,b3.(b1 â b2 â b3 â false) = false. + #b1; #b2; #b3; nelim b1; nelim b2; nelim b3; nnormalize; napply refl_eq. nqed. + +nlemma andb_false5_1 : âb1,b2,b3,b4.(false â b1 â b2 â b3 â b4) = false. + #b1; #b2; #b3; #b4; nnormalize; napply refl_eq. nqed. +nlemma andb_false5_2 : âb1,b2,b3,b4.(b1 â false â b2 â b3 â b4) = false. + #b1; #b2; #b3; #b4; nelim b1; nnormalize; napply refl_eq. nqed. +nlemma andb_false5_3 : âb1,b2,b3,b4.(b1 â b2 â false â b3 â b4) = false. + #b1; #b2; #b3; #b4; nelim b1; nelim b2; nnormalize; napply refl_eq. nqed. +nlemma andb_false5_4 : âb1,b2,b3,b4.(b1 â b2 â b3 â false â b4) = false. + #b1; #b2; #b3; #b4; nelim b1; nelim b2; nelim b3; nnormalize; napply refl_eq. nqed. +nlemma andb_false5_5 : âb1,b2,b3,b4.(b1 â b2 â b3 â b4 â false) = false. + #b1; #b2; #b3; #b4; nelim b1; nelim b2; nelim b3; nelim b4; nnormalize; napply refl_eq. nqed. + +nlemma orb_false_false_l : âb1,b2:bool.(b1 â b2) = false â b1 = false. + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##4: #H; napply refl_eq + ##| ##*: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma orb_false_false_r : âb1,b2:bool.(b1 â b2) = false â b2 = false. + #b1; #b2; + ncases b1; + ncases b2; + nnormalize; + ##[ ##4: #H; napply refl_eq + ##| ##*: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. diff --git a/helm/software/matita/contribs/ng_assembly2/num/byte8.ma b/helm/software/matita/contribs/ng_assembly2/num/byte8.ma new file mode 100755 index 000000000..c45d71c6e --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/byte8.ma @@ -0,0 +1,337 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/comp_num.ma". +include "num/exadecim.ma". +include "num/bitrigesim.ma". + +(* **** *) +(* BYTE *) +(* **** *) + +ndefinition byte8 â comp_num exadecim. +ndefinition mk_byte8 â λe1,e2.mk_comp_num exadecim e1 e2. + +(* \langle \rangle *) +notation "â©x,yâª" non associative with precedence 80 + for @{ mk_comp_num exadecim $x $y }. + +ndefinition byte8_is_comparable_ext â cn_is_comparable_ext exadecim_is_comparable_ext. +unification hint 0 â ⢠carr (comp_base byte8_is_comparable_ext) â¡ comp_num exadecim. +unification hint 0 â ⢠carr (comp_base byte8_is_comparable_ext) â¡ byte8. + +(* operatore estensione unsigned *) +ndefinition extu_b8 â λe2.â©zeroc ?,e2âª. + +(* operatore estensione signed *) +ndefinition exts_b8 â +λe2.â©(match getMSBc ? e2 with + [ true â predc ? (zeroc ?) | false â zeroc ? ]),e2âª. + +(* operatore moltiplicazione senza segno: e*e=[0x00,0xE1] *) +ndefinition mulu_ex â +λe1,e2:exadecim.match e1 with + [ x0 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x0⪠| x2 â â©x0,x0⪠| x3 â â©x0,x0⪠+ | x4 â â©x0,x0⪠| x5 â â©x0,x0⪠| x6 â â©x0,x0⪠| x7 â â©x0,x0⪠+ | x8 â â©x0,x0⪠| x9 â â©x0,x0⪠| xA â â©x0,x0⪠| xB â â©x0,x0⪠+ | xC â â©x0,x0⪠| xD â â©x0,x0⪠| xE â â©x0,x0⪠| xF â â©x0,x0⪠] + | x1 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x1⪠| x2 â â©x0,x2⪠| x3 â â©x0,x3⪠+ | x4 â â©x0,x4⪠| x5 â â©x0,x5⪠| x6 â â©x0,x6⪠| x7 â â©x0,x7⪠+ | x8 â â©x0,x8⪠| x9 â â©x0,x9⪠| xA â â©x0,xA⪠| xB â â©x0,xB⪠+ | xC â â©x0,xC⪠| xD â â©x0,xD⪠| xE â â©x0,xE⪠| xF â â©x0,xF⪠] + | x2 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x2⪠| x2 â â©x0,x4⪠| x3 â â©x0,x6⪠+ | x4 â â©x0,x8⪠| x5 â â©x0,xA⪠| x6 â â©x0,xC⪠| x7 â â©x0,xE⪠+ | x8 â â©x1,x0⪠| x9 â â©x1,x2⪠| xA â â©x1,x4⪠| xB â â©x1,x6⪠+ | xC â â©x1,x8⪠| xD â â©x1,xA⪠| xE â â©x1,xC⪠| xF â â©x1,xE⪠] + | x3 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x3⪠| x2 â â©x0,x6⪠| x3 â â©x0,x9⪠+ | x4 â â©x0,xC⪠| x5 â â©x0,xF⪠| x6 â â©x1,x2⪠| x7 â â©x1,x5⪠+ | x8 â â©x1,x8⪠| x9 â â©x1,xB⪠| xA â â©x1,xE⪠| xB â â©x2,x1⪠+ | xC â â©x2,x4⪠| xD â â©x2,x7⪠| xE â â©x2,xA⪠| xF â â©x2,xD⪠] + | x4 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x4⪠| x2 â â©x0,x8⪠| x3 â â©x0,xC⪠+ | x4 â â©x1,x0⪠| x5 â â©x1,x4⪠| x6 â â©x1,x8⪠| x7 â â©x1,xC⪠+ | x8 â â©x2,x0⪠| x9 â â©x2,x4⪠| xA â â©x2,x8⪠| xB â â©x2,xC⪠+ | xC â â©x3,x0⪠| xD â â©x3,x4⪠| xE â â©x3,x8⪠| xF â â©x3,xC⪠] + | x5 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x5⪠| x2 â â©x0,xA⪠| x3 â â©x0,xF⪠+ | x4 â â©x1,x4⪠| x5 â â©x1,x9⪠| x6 â â©x1,xE⪠| x7 â â©x2,x3⪠+ | x8 â â©x2,x8⪠| x9 â â©x2,xD⪠| xA â â©x3,x2⪠| xB â â©x3,x7⪠+ | xC â â©x3,xC⪠| xD â â©x4,x1⪠| xE â â©x4,x6⪠| xF â â©x4,xB⪠] + | x6 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x6⪠| x2 â â©x0,xC⪠| x3 â â©x1,x2⪠+ | x4 â â©x1,x8⪠| x5 â â©x1,xE⪠| x6 â â©x2,x4⪠| x7 â â©x2,xA⪠+ | x8 â â©x3,x0⪠| x9 â â©x3,x6⪠| xA â â©x3,xC⪠| xB â â©x4,x2⪠+ | xC â â©x4,x8⪠| xD â â©x4,xE⪠| xE â â©x5,x4⪠| xF â â©x5,xA⪠] + | x7 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x7⪠| x2 â â©x0,xE⪠| x3 â â©x1,x5⪠+ | x4 â â©x1,xC⪠| x5 â â©x2,x3⪠| x6 â â©x2,xA⪠| x7 â â©x3,x1⪠+ | x8 â â©x3,x8⪠| x9 â â©x3,xF⪠| xA â â©x4,x6⪠| xB â â©x4,xD⪠+ | xC â â©x5,x4⪠| xD â â©x5,xB⪠| xE â â©x6,x2⪠| xF â â©x6,x9⪠] + | x8 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x8⪠| x2 â â©x1,x0⪠| x3 â â©x1,x8⪠+ | x4 â â©x2,x0⪠| x5 â â©x2,x8⪠| x6 â â©x3,x0⪠| x7 â â©x3,x8⪠+ | x8 â â©x4,x0⪠| x9 â â©x4,x8⪠| xA â â©x5,x0⪠| xB â â©x5,x8⪠+ | xC â â©x6,x0⪠| xD â â©x6,x8⪠| xE â â©x7,x0⪠| xF â â©x7,x8⪠] + | x9 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x9⪠| x2 â â©x1,x2⪠| x3 â â©x1,xB⪠+ | x4 â â©x2,x4⪠| x5 â â©x2,xD⪠| x6 â â©x3,x6⪠| x7 â â©x3,xF⪠+ | x8 â â©x4,x8⪠| x9 â â©x5,x1⪠| xA â â©x5,xA⪠| xB â â©x6,x3⪠+ | xC â â©x6,xC⪠| xD â â©x7,x5⪠| xE â â©x7,xE⪠| xF â â©x8,x7⪠] + | xA â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,xA⪠| x2 â â©x1,x4⪠| x3 â â©x1,xE⪠+ | x4 â â©x2,x8⪠| x5 â â©x3,x2⪠| x6 â â©x3,xC⪠| x7 â â©x4,x6⪠+ | x8 â â©x5,x0⪠| x9 â â©x5,xA⪠| xA â â©x6,x4⪠| xB â â©x6,xE⪠+ | xC â â©x7,x8⪠| xD â â©x8,x2⪠| xE â â©x8,xC⪠| xF â â©x9,x6⪠] + | xB â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,xB⪠| x2 â â©x1,x6⪠| x3 â â©x2,x1⪠+ | x4 â â©x2,xC⪠| x5 â â©x3,x7⪠| x6 â â©x4,x2⪠| x7 â â©x4,xD⪠+ | x8 â â©x5,x8⪠| x9 â â©x6,x3⪠| xA â â©x6,xE⪠| xB â â©x7,x9⪠+ | xC â â©x8,x4⪠| xD â â©x8,xF⪠| xE â â©x9,xA⪠| xF â â©xA,x5⪠] + | xC â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,xC⪠| x2 â â©x1,x8⪠| x3 â â©x2,x4⪠+ | x4 â â©x3,x0⪠| x5 â â©x3,xC⪠| x6 â â©x4,x8⪠| x7 â â©x5,x4⪠+ | x8 â â©x6,x0⪠| x9 â â©x6,xC⪠| xA â â©x7,x8⪠| xB â â©x8,x4⪠+ | xC â â©x9,x0⪠| xD â â©x9,xC⪠| xE â â©xA,x8⪠| xF â â©xB,x4⪠] + | xD â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,xD⪠| x2 â â©x1,xA⪠| x3 â â©x2,x7⪠+ | x4 â â©x3,x4⪠| x5 â â©x4,x1⪠| x6 â â©x4,xE⪠| x7 â â©x5,xB⪠+ | x8 â â©x6,x8⪠| x9 â â©x7,x5⪠| xA â â©x8,x2⪠| xB â â©x8,xF⪠+ | xC â â©x9,xC⪠| xD â â©xA,x9⪠| xE â â©xB,x6⪠| xF â â©xC,x3⪠] + | xE â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,xE⪠| x2 â â©x1,xC⪠| x3 â â©x2,xA⪠+ | x4 â â©x3,x8⪠| x5 â â©x4,x6⪠| x6 â â©x5,x4⪠| x7 â â©x6,x2⪠+ | x8 â â©x7,x0⪠| x9 â â©x7,xE⪠| xA â â©x8,xC⪠| xB â â©x9,xA⪠+ | xC â â©xA,x8⪠| xD â â©xB,x6⪠| xE â â©xC,x4⪠| xF â â©xD,x2⪠] + | xF â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,xF⪠| x2 â â©x1,xE⪠| x3 â â©x2,xD⪠+ | x4 â â©x3,xC⪠| x5 â â©x4,xB⪠| x6 â â©x5,xA⪠| x7 â â©x6,x9⪠+ | x8 â â©x7,x8⪠| x9 â â©x8,x7⪠| xA â â©x9,x6⪠| xB â â©xA,x5⪠+ | xC â â©xB,x4⪠| xD â â©xC,x3⪠| xE â â©xD,x2⪠| xF â â©xE,x1⪠] + ]. + +(* operatore moltiplicazione con segno *) +ndefinition muls_ex â +λe1,e2:exadecim.match e1 with + [ x0 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x0⪠| x2 â â©x0,x0⪠| x3 â â©x0,x0⪠+ | x4 â â©x0,x0⪠| x5 â â©x0,x0⪠| x6 â â©x0,x0⪠| x7 â â©x0,x0⪠+ | x8 â â©x0,x0⪠| x9 â â©x0,x0⪠| xA â â©x0,x0⪠| xB â â©x0,x0⪠+ | xC â â©x0,x0⪠| xD â â©x0,x0⪠| xE â â©x0,x0⪠| xF â â©x0,x0⪠] + | x1 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x1⪠| x2 â â©x0,x2⪠| x3 â â©x0,x3⪠+ | x4 â â©x0,x4⪠| x5 â â©x0,x5⪠| x6 â â©x0,x6⪠| x7 â â©x0,x7⪠+ | x8 â â©xF,x8⪠| x9 â â©xF,x9⪠| xA â â©xF,xA⪠| xB â â©xF,xB⪠+ | xC â â©xF,xC⪠| xD â â©xF,xD⪠| xE â â©xF,xE⪠| xF â â©xF,xF⪠] + | x2 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x2⪠| x2 â â©x0,x4⪠| x3 â â©x0,x6⪠+ | x4 â â©x0,x8⪠| x5 â â©x0,xA⪠| x6 â â©x0,xC⪠| x7 â â©x0,xE⪠+ | x8 â â©xF,x0⪠| x9 â â©xF,x2⪠| xA â â©xF,x4⪠| xB â â©xF,x6⪠+ | xC â â©xF,x8⪠| xD â â©xF,xA⪠| xE â â©xF,xC⪠| xF â â©xF,xE⪠] + | x3 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x3⪠| x2 â â©x0,x6⪠| x3 â â©x0,x9⪠+ | x4 â â©x0,xC⪠| x5 â â©x0,xF⪠| x6 â â©x1,x2⪠| x7 â â©x1,x5⪠+ | x8 â â©xE,x8⪠| x9 â â©xE,xB⪠| xA â â©xE,xE⪠| xB â â©xF,x1⪠+ | xC â â©xF,x4⪠| xD â â©xF,x7⪠| xE â â©xF,xA⪠| xF â â©xF,xD⪠] + | x4 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x4⪠| x2 â â©x0,x8⪠| x3 â â©x0,xC⪠+ | x4 â â©x1,x0⪠| x5 â â©x1,x4⪠| x6 â â©x1,x8⪠| x7 â â©x1,xC⪠+ | x8 â â©xE,x0⪠| x9 â â©xE,x4⪠| xA â â©xE,x8⪠| xB â â©xE,xC⪠+ | xC â â©xF,x0⪠| xD â â©xF,x4⪠| xE â â©xF,x8⪠| xF â â©xF,xC⪠] + | x5 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x5⪠| x2 â â©x0,xA⪠| x3 â â©x0,xF⪠+ | x4 â â©x1,x4⪠| x5 â â©x1,x9⪠| x6 â â©x1,xE⪠| x7 â â©x2,x3⪠+ | x8 â â©xD,x8⪠| x9 â â©xD,xD⪠| xA â â©xE,x2⪠| xB â â©xE,x7⪠+ | xC â â©xE,xC⪠| xD â â©xF,x1⪠| xE â â©xF,x6⪠| xF â â©xF,xB⪠] + | x6 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x6⪠| x2 â â©x0,xC⪠| x3 â â©x1,x2⪠+ | x4 â â©x1,x8⪠| x5 â â©x1,xE⪠| x6 â â©x2,x4⪠| x7 â â©x2,xA⪠+ | x8 â â©xD,x0⪠| x9 â â©xD,x6⪠| xA â â©xD,xC⪠| xB â â©xE,x2⪠+ | xC â â©xE,x8⪠| xD â â©xE,xE⪠| xE â â©xF,x4⪠| xF â â©xF,xA⪠] + | x7 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©x0,x7⪠| x2 â â©x0,xE⪠| x3 â â©x1,x5⪠+ | x4 â â©x1,xC⪠| x5 â â©x2,x3⪠| x6 â â©x2,xA⪠| x7 â â©x3,x1⪠+ | x8 â â©xC,x8⪠| x9 â â©xC,xF⪠| xA â â©xD,x6⪠| xB â â©xD,xD⪠+ | xC â â©xE,x4⪠| xD â â©xE,xB⪠| xE â â©xF,x2⪠| xF â â©xF,x9⪠] + | x8 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,x8⪠| x2 â â©xF,x0⪠| x3 â â©xE,x8⪠+ | x4 â â©xE,x0⪠| x5 â â©xD,x8⪠| x6 â â©xD,x0⪠| x7 â â©xC,x8⪠+ | x8 â â©x4,x0⪠| x9 â â©x3,x8⪠| xA â â©x3,x0⪠| xB â â©x2,x8⪠+ | xC â â©x2,x0⪠| xD â â©x1,x8⪠| xE â â©x1,x0⪠| xF â â©x0,x8⪠] + | x9 â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,x9⪠| x2 â â©xF,x2⪠| x3 â â©xE,xB⪠+ | x4 â â©xE,x4⪠| x5 â â©xD,xD⪠| x6 â â©xD,x6⪠| x7 â â©xC,xF⪠+ | x8 â â©x3,x8⪠| x9 â â©x3,x1⪠| xA â â©x2,xA⪠| xB â â©x2,x3⪠+ | xC â â©x1,xC⪠| xD â â©x1,x5⪠| xE â â©x0,xE⪠| xF â â©x0,x7⪠] + | xA â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,xA⪠| x2 â â©xF,x4⪠| x3 â â©xE,xE⪠+ | x4 â â©xE,x8⪠| x5 â â©xE,x2⪠| x6 â â©xD,xC⪠| x7 â â©xD,x6⪠+ | x8 â â©x3,x0⪠| x9 â â©x2,xA⪠| xA â â©x2,x4⪠| xB â â©x1,xE⪠+ | xC â â©x1,x8⪠| xD â â©x1,x2⪠| xE â â©x0,xC⪠| xF â â©x0,x6⪠] + | xB â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,xB⪠| x2 â â©xF,x6⪠| x3 â â©xF,x1⪠+ | x4 â â©xE,xC⪠| x5 â â©xE,x7⪠| x6 â â©xE,x2⪠| x7 â â©xD,xD⪠+ | x8 â â©x2,x8⪠| x9 â â©x2,x3⪠| xA â â©x1,xE⪠| xB â â©x1,x9⪠+ | xC â â©x1,x4⪠| xD â â©x0,xF⪠| xE â â©x0,xA⪠| xF â â©x0,x5⪠] + | xC â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,xC⪠| x2 â â©xF,x8⪠| x3 â â©xF,x4⪠+ | x4 â â©xF,x0⪠| x5 â â©xE,xC⪠| x6 â â©xE,x8⪠| x7 â â©xE,x4⪠+ | x8 â â©x2,x0⪠| x9 â â©x1,xC⪠| xA â â©x1,x8⪠| xB â â©x1,x4⪠+ | xC â â©x1,x0⪠| xD â â©x0,xC⪠| xE â â©x0,x8⪠| xF â â©x0,x4⪠] + | xD â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,xD⪠| x2 â â©xF,xA⪠| x3 â â©xF,x7⪠+ | x4 â â©xF,x4⪠| x5 â â©xF,x1⪠| x6 â â©xE,xE⪠| x7 â â©xE,xB⪠+ | x8 â â©x1,x8⪠| x9 â â©x1,x5⪠| xA â â©x1,x2⪠| xB â â©x0,xF⪠+ | xC â â©x0,xC⪠| xD â â©x0,x9⪠| xE â â©x0,x6⪠| xF â â©x0,x3⪠] + | xE â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,xE⪠| x2 â â©xF,xC⪠| x3 â â©xF,xA⪠+ | x4 â â©xF,x8⪠| x5 â â©xF,x6⪠| x6 â â©xF,x4⪠| x7 â â©xF,x2⪠+ | x8 â â©x1,x0⪠| x9 â â©x0,xE⪠| xA â â©x0,xC⪠| xB â â©x0,xA⪠+ | xC â â©x0,x8⪠| xD â â©x0,x6⪠| xE â â©x0,x4⪠| xF â â©x0,x2⪠] + | xF â match e2 with + [ x0 â â©x0,x0⪠| x1 â â©xF,xF⪠| x2 â â©xF,xE⪠| x3 â â©xF,xD⪠+ | x4 â â©xF,xC⪠| x5 â â©xF,xB⪠| x6 â â©xF,xA⪠| x7 â â©xF,x9⪠+ | x8 â â©x0,x8⪠| x9 â â©x0,x7⪠| xA â â©x0,x6⪠| xB â â©x0,x5⪠+ | xC â â©x0,x4⪠| xD â â©x0,x3⪠| xE â â©x0,x2⪠| xF â â©x0,x1⪠] + ]. + +(* correzione per somma su BCD *) +(* input: halfcarry,carry,X(BCD+BCD) *) +(* output: X',carry' *) +ndefinition daa_b8 â +λh,c:bool.λX:byte8. + match ltc ? X â©x9,xA⪠with + (* [X:0x00-0x99] *) + (* c' = c *) + (* X' = [(b16l X):0x0-0x9] X + [h=1 ? 0x06 : 0x00] + [c=1 ? 0x60 : 0x00] + [(b16l X):0xA-0xF] X + 0x06 + [c=1 ? 0x60 : 0x00] *) + [ true â + let X' â match (ltc ? (cnL ? X) xA) â (âh) with + [ true â X + | false â plusc_d_d ? X â©x0,x6⪠] in + let X'' â match c with + [ true â plusc_d_d ? X' â©x6,x0⪠+ | false â X' ] in + pair ⦠c X'' + (* [X:0x9A-0xFF] *) + (* c' = 1 *) + (* X' = [X:0x9A-0xFF] + [(b16l X):0x0-0x9] X + [h=1 ? 0x06 : 0x00] + 0x60 + [(b16l X):0xA-0xF] X + 0x6 + 0x60 *) + | false â + let X' â match (ltc ? (cnL ? X) xA) â (âh) with + [ true â X + | false â plusc_d_d ? X â©x0,x6⪠] in + let X'' â plusc_d_d ? X' â©x6,x0⪠in + pair ⦠true X'' + ]. + +(* byte ricorsivi *) +ninductive rec_byte8 : byte8 â Type â + b8_O : rec_byte8 (zeroc ?) +| b8_S : ân.rec_byte8 n â rec_byte8 (succc ? n). + +(* byte â byte ricorsivi *) +ndefinition b8_to_recb8_aux1 : Î n.rec_byte8 â©n,x0⪠â rec_byte8 â©succc ? n,x0⪠â +λn.λrecb:rec_byte8 â©n,x0âª. + b8_S â©n,xF⪠(b8_S â©n,xE⪠(b8_S â©n,xD⪠(b8_S â©n,xC⪠( + b8_S â©n,xB⪠(b8_S â©n,xA⪠(b8_S â©n,x9⪠(b8_S â©n,x8⪠( + b8_S â©n,x7⪠(b8_S â©n,x6⪠(b8_S â©n,x5⪠(b8_S â©n,x4⪠( + b8_S â©n,x3⪠(b8_S â©n,x2⪠(b8_S â©n,x1⪠(b8_S â©n,x0⪠recb))))))))))))))). + +(* ... cifra esadecimale superiore *) +nlet rec b8_to_recb8_aux2 (n:exadecim) (r:rec_exadecim n) on r â + match r return λx.λy:rec_exadecim x.rec_byte8 â©x,x0⪠with + [ ex_O â b8_O + | ex_S t n' â b8_to_recb8_aux1 ? (b8_to_recb8_aux2 t n') + ]. + +(* ... cifra esadecimale inferiore *) +ndefinition b8_to_recb8_aux3 : Î n1,n2.rec_byte8 â©n1,x0⪠â rec_byte8 â©n1,n2⪠â +λn1,n2.λrecb:rec_byte8 â©n1,x0âª. + match n2 return λx.rec_byte8 â©n1,x⪠with + [ x0 â recb + | x1 â b8_S â©n1,x0⪠recb + | x2 â b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb) + | x3 â b8_S â©n1,x2⪠(b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb)) + | x4 â b8_S â©n1,x3⪠(b8_S â©n1,x2⪠(b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb))) + | x5 â b8_S â©n1,x4⪠(b8_S â©n1,x3⪠(b8_S â©n1,x2⪠(b8_S â©n1,x1⪠( + b8_S â©n1,x0⪠recb)))) + | x6 â b8_S â©n1,x5⪠(b8_S â©n1,x4⪠(b8_S â©n1,x3⪠(b8_S â©n1,x2⪠( + b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb))))) + | x7 â b8_S â©n1,x6⪠(b8_S â©n1,x5⪠(b8_S â©n1,x4⪠(b8_S â©n1,x3⪠( + b8_S â©n1,x2⪠(b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb)))))) + | x8 â b8_S â©n1,x7⪠(b8_S â©n1,x6⪠(b8_S â©n1,x5⪠(b8_S â©n1,x4⪠( + b8_S â©n1,x3⪠(b8_S â©n1,x2⪠(b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb))))))) + | x9 â b8_S â©n1,x8⪠(b8_S â©n1,x7⪠(b8_S â©n1,x6⪠(b8_S â©n1,x5⪠( + b8_S â©n1,x4⪠(b8_S â©n1,x3⪠(b8_S â©n1,x2⪠(b8_S â©n1,x1⪠( + b8_S â©n1,x0⪠recb)))))))) + | xA â b8_S â©n1,x9⪠(b8_S â©n1,x8⪠(b8_S â©n1,x7⪠(b8_S â©n1,x6⪠( + b8_S â©n1,x5⪠(b8_S â©n1,x4⪠(b8_S â©n1,x3⪠(b8_S â©n1,x2⪠( + b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb))))))))) + | xB â b8_S â©n1,xA⪠(b8_S â©n1,x9⪠(b8_S â©n1,x8⪠(b8_S â©n1,x7⪠( + b8_S â©n1,x6⪠(b8_S â©n1,x5⪠(b8_S â©n1,x4⪠(b8_S â©n1,x3⪠( + b8_S â©n1,x2⪠(b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb)))))))))) + | xC â b8_S â©n1,xB⪠(b8_S â©n1,xA⪠(b8_S â©n1,x9⪠(b8_S â©n1,x8⪠( + b8_S â©n1,x7⪠(b8_S â©n1,x6⪠(b8_S â©n1,x5⪠(b8_S â©n1,x4⪠( + b8_S â©n1,x3⪠(b8_S â©n1,x2⪠(b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb))))))))))) + | xD â b8_S â©n1,xC⪠(b8_S â©n1,xB⪠(b8_S â©n1,xA⪠(b8_S â©n1,x9⪠( + b8_S â©n1,x8⪠(b8_S â©n1,x7⪠(b8_S â©n1,x6⪠(b8_S â©n1,x5⪠( + b8_S â©n1,x4⪠(b8_S â©n1,x3⪠(b8_S â©n1,x2⪠(b8_S â©n1,x1⪠( + b8_S â©n1,x0⪠recb)))))))))))) + | xE â b8_S â©n1,xD⪠(b8_S â©n1,xC⪠(b8_S â©n1,xB⪠(b8_S â©n1,xA⪠( + b8_S â©n1,x9⪠(b8_S â©n1,x8⪠(b8_S â©n1,x7⪠(b8_S â©n1,x6⪠( + b8_S â©n1,x5⪠(b8_S â©n1,x4⪠(b8_S â©n1,x3⪠(b8_S â©n1,x2⪠( + b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb))))))))))))) + | xF â b8_S â©n1,xE⪠(b8_S â©n1,xD⪠(b8_S â©n1,xC⪠(b8_S â©n1,xB⪠( + b8_S â©n1,xA⪠(b8_S â©n1,x9⪠(b8_S â©n1,x8⪠(b8_S â©n1,x7⪠( + b8_S â©n1,x6⪠(b8_S â©n1,x5⪠(b8_S â©n1,x4⪠(b8_S â©n1,x3⪠( + b8_S â©n1,x2⪠(b8_S â©n1,x1⪠(b8_S â©n1,x0⪠recb)))))))))))))) + ]. + +(* +nlemma b8_to_recb8 : Î b.rec_byte8 b. + #b; nletin K â (b8_to_recb8_aux3 + (b8h b) (b8l b) (b8_to_recb8_aux2 (b8h b) (ex_to_recex (b8h b)))); + ncases b in K; #e1; #e2; #K; napply K; +nqed. +*) + +ndefinition b8_to_recb8 : Î b.rec_byte8 b â +λb.match b with + [ mk_comp_num h l â b8_to_recb8_aux3 h l (b8_to_recb8_aux2 h (ex_to_recex h)) ]. + +(* ottali â esadecimali *) +ndefinition b8_of_bit â +λn.match n with + [ t00 â â©x0,x0⪠| t01 â â©x0,x1⪠| t02 â â©x0,x2⪠| t03 â â©x0,x3⪠+ | t04 â â©x0,x4⪠| t05 â â©x0,x5⪠| t06 â â©x0,x6⪠| t07 â â©x0,x7⪠+ | t08 â â©x0,x8⪠| t09 â â©x0,x9⪠| t0A â â©x0,xA⪠| t0B â â©x0,xB⪠+ | t0C â â©x0,xC⪠| t0D â â©x0,xD⪠| t0E â â©x0,xE⪠| t0F â â©x0,xF⪠+ | t10 â â©x1,x0⪠| t11 â â©x1,x1⪠| t12 â â©x1,x2⪠| t13 â â©x1,x3⪠+ | t14 â â©x1,x4⪠| t15 â â©x1,x5⪠| t16 â â©x1,x6⪠| t17 â â©x1,x7⪠+ | t18 â â©x1,x8⪠| t19 â â©x1,x9⪠| t1A â â©x1,xA⪠| t1B â â©x1,xB⪠+ | t1C â â©x1,xC⪠| t1D â â©x1,xD⪠| t1E â â©x1,xE⪠| t1F â â©x1,xF⪠+ ]. diff --git a/helm/software/matita/contribs/ng_assembly2/num/comp_ext.ma b/helm/software/matita/contribs/ng_assembly2/num/comp_ext.ma new file mode 100755 index 000000000..58df52a1e --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/comp_ext.ma @@ -0,0 +1,62 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/comp.ma". +include "common/prod.ma". + +alias symbol "hint_decl" (instance 1) = "hint_decl_Type1". + +nrecord comparable_ext : Type[1] â + { + comp_base : comparable; + ltc : (carr comp_base) â (carr comp_base) â bool; + lec : (carr comp_base) â (carr comp_base) â bool; + gtc : (carr comp_base) â (carr comp_base) â bool; + gec : (carr comp_base) â (carr comp_base) â bool; + andc : (carr comp_base) â (carr comp_base) â (carr comp_base); + orc : (carr comp_base) â (carr comp_base) â (carr comp_base); + xorc : (carr comp_base) â (carr comp_base) â (carr comp_base); + getMSBc : (carr comp_base) â bool; + setMSBc : (carr comp_base) â (carr comp_base); + clrMSBc : (carr comp_base) â (carr comp_base); + getLSBc : (carr comp_base) â bool; + setLSBc : (carr comp_base) â (carr comp_base); + clrLSBc : (carr comp_base) â (carr comp_base); + rcrc : bool â (carr comp_base) â ProdT bool (carr comp_base); + shrc : (carr comp_base) â ProdT bool (carr comp_base); + rorc : (carr comp_base) â (carr comp_base); + rclc : bool â (carr comp_base) â ProdT bool (carr comp_base); + shlc : (carr comp_base) â ProdT bool (carr comp_base); + rolc : (carr comp_base) â (carr comp_base); + notc : (carr comp_base) â (carr comp_base); + plusc_dc_dc : bool â (carr comp_base) â (carr comp_base) â ProdT bool (carr comp_base); + plusc_d_dc : (carr comp_base) â (carr comp_base) â ProdT bool (carr comp_base); + plusc_dc_d : bool â (carr comp_base) â (carr comp_base) â (carr comp_base); + plusc_d_d : (carr comp_base) â (carr comp_base) â (carr comp_base); + plusc_dc_c : bool â (carr comp_base) â (carr comp_base) â bool; + plusc_d_c : (carr comp_base) â (carr comp_base) â bool; + predc : (carr comp_base) â (carr comp_base); + succc : (carr comp_base) â (carr comp_base); + complc : (carr comp_base) â (carr comp_base); + absc : (carr comp_base) â (carr comp_base); + inrangec : (carr comp_base) â (carr comp_base) â (carr comp_base) â bool + }. diff --git a/helm/software/matita/contribs/ng_assembly2/num/comp_num.ma b/helm/software/matita/contribs/ng_assembly2/num/comp_num.ma new file mode 100755 index 000000000..a062a5624 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/comp_num.ma @@ -0,0 +1,354 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/comp_ext.ma". +include "num/bool_lemmas.ma". + +(* ******** *) +(* COMPOSTI *) +(* ******** *) + +nrecord comp_num (T:Type) : Type â + { + cnH: T; + cnL: T + }. + +(* operatore = *) +ndefinition eq_cn â +λT.λfeq:T â T â bool. +λcn1,cn2:comp_num T. + (feq (cnH ? cn1) (cnH ? cn2)) â (feq (cnL ? cn1) (cnL ? cn2)). + +nlemma cn_destruct_1 : +âT.âx1,x2,y1,y2:T. + mk_comp_num T x1 y1 = mk_comp_num T x2 y2 â x1 = x2. + #T; #x1; #x2; #y1; #y2; #H; + nchange with (match mk_comp_num ? x2 y2 with [ mk_comp_num a _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma cn_destruct_2 : +âT.âx1,x2,y1,y2:T. + mk_comp_num T x1 y1 = mk_comp_num T x2 y2 â y1 = y2. + #T; #x1; #x2; #y1; #y2; #H; + nchange with (match mk_comp_num ? x2 y2 with [ mk_comp_num _ b â y1 = b ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_eqcn : +âT.âfeq:T â T â bool. + (symmetricT T bool feq) â + (symmetricT (comp_num T) bool (eq_cn T feq)). + #T; #feq; #H; + #b1; nelim b1; #e1; #e2; + #b2; nelim b2; #e3; #e4; + nchange with (((feq e1 e3)â(feq e2 e4)) = ((feq e3 e1)â(feq e4 e2))); + nrewrite > (H e1 e3); + nrewrite > (H e2 e4); + napply refl_eq. +nqed. + +nlemma eqcn_to_eq : +âT.âfeq:T â T â bool. + (âx,y:T.(feq x y = true) â (x = y)) â + (âb1,b2:comp_num T. + ((eq_cn T feq b1 b2 = true) â (b1 = b2))). + #T; #feq; #H; #b1; #b2; + nelim b1; #e1; #e2; + nelim b2; #e3; #e4; + nchange in ⢠(% â ?) with (((feq e1 e3)â(feq e2 e4)) = true); + #H1; + nrewrite < (H ⦠(andb_true_true_l ⦠H1)); + nrewrite < (H ⦠(andb_true_true_r ⦠H1)); + napply refl_eq. +nqed. + +nlemma eq_to_eqcn : +âT.âfeq:T â T â bool. + (âx,y:T.(x = y) â (feq x y = true)) â + (âb1,b2:comp_num T. + ((b1 = b2) â (eq_cn T feq b1 b2 = true))). + #T; #feq; #H; #b1; #b2; + nelim b1; #e1; #e2; + nelim b2; #e3; #e4; + #H1; + nrewrite < (cn_destruct_1 ⦠H1); + nrewrite < (cn_destruct_2 ⦠H1); + nchange with (((feq e1 e1)â(feq e2 e2)) = true); + nrewrite > (H e1 e1 (refl_eq â¦)); + nrewrite > (H e2 e2 (refl_eq â¦)); + nnormalize; + napply refl_eq. +nqed. + +nlemma decidable_cn_aux1 : +âT.âe1,e2,e3,e4:T.e1 â e3 â (mk_comp_num T e1 e2) â (mk_comp_num T e3 e4). + #T; #e1; #e2; #e3; #e4; + nnormalize; #H; #H1; + napply (H (cn_destruct_1 ⦠H1)). +nqed. + +nlemma decidable_cn_aux2 : +âT.âe1,e2,e3,e4:T.e2 â e4 â (mk_comp_num T e1 e2) â (mk_comp_num T e3 e4). + #T; #e1; #e2; #e3; #e4; + nnormalize; #H; #H1; + napply (H (cn_destruct_2 ⦠H1)). +nqed. + +nlemma decidable_cn : +âT.(âx,y:T.decidable (x = y)) â + (âb1,b2:comp_num T. + (decidable (b1 = b2))). + #T; #H; + #b1; nelim b1; #e1; #e2; + #b2; nelim b2; #e3; #e4; + nnormalize; + napply (or2_elim (e1 = e3) (e1 â e3) ? (H e1 e3) â¦); + ##[ ##2: #H1; napply (or2_intro2 ⦠(decidable_cn_aux1 T e1 e2 e3 e4 H1)) + ##| ##1: #H1; napply (or2_elim (e2 = e4) (e2 â e4) ? (H e2 e4) â¦); + ##[ ##2: #H2; napply (or2_intro2 ⦠(decidable_cn_aux2 T e1 e2 e3 e4 H2)) + ##| ##1: #H2; nrewrite > H1; nrewrite > H2; + napply (or2_intro1 ⦠(refl_eq ? (mk_comp_num T e3 e4))) + ##] + ##] +nqed. + +nlemma neqcn_to_neq : +âT.âfeq:T â T â bool. + (âx,y:T.(feq x y = false) â (x â y)) â + (âb1,b2:comp_num T. + ((eq_cn T feq b1 b2 = false) â (b1 â b2))). + #T; #feq; #H; #b1; #b2; + nelim b1; #e1; #e2; + nelim b2; #e3; #e4; + nchange with ((((feq e1 e3) â (feq e2 e4)) = false) â ?); + #H1; + napply (or2_elim ((feq e1 e3) = false) ((feq e2 e4) = false) ? (andb_false2 ⦠H1) â¦); + ##[ ##1: #H2; napply (decidable_cn_aux1 ⦠(H ⦠H2)) + ##| ##2: #H2; napply (decidable_cn_aux2 ⦠(H ⦠H2)) + ##] +nqed. + +nlemma cn_destruct : +âT.(âx,y:T.decidable (x = y)) â + (âe1,e2,e3,e4:T. + ((mk_comp_num T e1 e2) â (mk_comp_num T e3 e4)) â + ((e1 â e3) ⨠(e2 â e4))). + #T; #H; #e1; #e2; #e3; #e4; + nnormalize; #H1; + napply (or2_elim (e1 = e3) (e1 â e3) ? (H e1 e3) â¦); + ##[ ##2: #H2; napply (or2_intro1 ⦠H2) + ##| ##1: #H2; napply (or2_elim (e2 = e4) (e2 â e4) ? (H e2 e4) â¦); + ##[ ##2: #H3; napply (or2_intro2 ⦠H3) + ##| ##1: #H3; nrewrite > H2 in H1:(%); + nrewrite > H3; + #H1; nelim (H1 (refl_eq â¦)) + ##] + ##] +nqed. + +nlemma neq_to_neqcn : +âT.âfeq:T â T â bool. + (âx,y:T.(x â y) â (feq x y = false)) â + (âx,y:T.decidable (x = y)) â + (âb1,b2:comp_num T. + ((b1 â b2) â (eq_cn T feq b1 b2 = false))). + #T; #feq; #H; #H1; #b1; #b2; + nelim b1; #e1; #e2; + nelim b2; #e3; #e4; + #H2; nchange with (((feq e1 e3) â (feq e2 e4)) = false); + napply (or2_elim (e1 â e3) (e2 â e4) ? (cn_destruct T H1 e1 e2 e3 e4 ⦠H2) â¦); + ##[ ##1: #H3; nrewrite > (H ⦠H3); nnormalize; napply refl_eq + ##| ##2: #H3; nrewrite > (H ⦠H3); + nrewrite > (symmetric_andbool (feq e1 e3) false); + nnormalize; napply refl_eq + ##] +nqed. + +nlemma cn_is_comparable : comparable â comparable. + #T; @ (comp_num T) + (* zero *) + ##[ napply (mk_comp_num ? (zeroc ?) (zeroc ?)) + (* forall *) + ##| napply (λP.forallc T + (λh.forallc T + (λl.P (mk_comp_num ? h l)))) + (* eq *) + ##| napply (eq_cn ? (eqc T)) + (* eqc_to_eq *) + ##| napply (eqcn_to_eq ⦠(eqc_to_eq T)) + (* eq_to_eqc *) + ##| napply (eq_to_eqcn ⦠(eq_to_eqc T)) + (* neqc_to_neq *) + ##| napply (neqcn_to_neq ⦠(neqc_to_neq T)) + (* neq_to_neqc *) + ##| napply (neq_to_neqcn ⦠(neq_to_neqc T)); + napply (decidable_c T) + (* decidable_c *) + ##| napply (decidable_cn ⦠(decidable_c T)) + (* symmetric_eqc *) + ##| napply (symmetric_eqcn ⦠(symmetric_eqc T)) + ##] +nqed. + +nlemma cn_is_comparable_ext : comparable_ext â comparable_ext. + #T; nelim T; #c; + #ltc; #lec; #gtc; #gec; #andc; #orc; #xorc; + #getMSBc; #setMSBc; #clrMSBc; #getLSBc; #setLSBc; #clrLSBc; + #rcrc; #shrc; #rorc; #rclc; #shlc; #rolc; #notc; + #plusc_dc_dc; #plusc_d_dc; #plusc_dc_d; #plusc_d_d; #plusc_dc_c; #plusc_d_c; + #predc; #succc; #complc; #absc; #inrangec; + napply (mk_comparable_ext); + ##[ napply (cn_is_comparable c) + (* lt *) + ##| napply (λx,y.(ltc (cnH ? x) (cnH ? y)) â + (((eqc c) (cnH ? x) (cnH ? y)) â (ltc (cnL ? x) (cnL ? y)))) + (* le *) + ##| napply (λx,y.(ltc (cnH ? x) (cnH ? y)) â + (((eqc c) (cnH ? x) (cnH ? y)) â (lec (cnL ? x) (cnL ? y)))) + (* gt *) + ##| napply (λx,y.(gtc (cnH ? x) (cnH ? y)) â + (((eqc c) (cnH ? x) (cnH ? y)) â (gtc (cnL ? x) (cnL ? y)))) + (* ge *) + ##| napply (λx,y.(gtc (cnH ? x) (cnH ? y)) â + (((eqc c) (cnH ? x) (cnH ? y)) â (gec (cnL ? x) (cnL ? y)))) + (* and *) + ##| napply (λx,y.mk_comp_num ? (andc (cnH ? x) (cnH ? y)) + (andc (cnL ? x) (cnL ? y))) + (* or *) + ##| napply (λx,y.mk_comp_num ? (orc (cnH ? x) (cnH ? y)) + (orc (cnL ? x) (cnL ? y))) + (* xor *) + ##| napply (λx,y.mk_comp_num ? (xorc (cnH ? x) (cnH ? y)) + (xorc (cnL ? x) (cnL ? y))) + (* getMSB *) + ##| napply (λx.getMSBc (cnH ? x)) + (* setMSB *) + ##| napply (λx.mk_comp_num ? (setMSBc (cnH ? x)) (cnL ? x)) + (* clrMSB *) + ##| napply (λx.mk_comp_num ? (clrMSBc (cnH ? x)) (cnL ? x)) + (* getLSB *) + ##| napply (λx.getLSBc (cnL ? x)) + (* setLSB *) + ##| napply (λx.mk_comp_num ? (cnH ? x) (setLSBc (cnL ? x))) + (* clrLSB *) + ##| napply (λx.mk_comp_num ? (cnH ? x) (clrLSBc (cnL ? x))) + (* rcr *) + ##| napply (λcy,x.match rcrc cy (cnH ? x) with + [ pair cy' cnh' â match rcrc cy' (cnL ? x) with + [ pair cy'' cnl' â pair ⦠cy'' (mk_comp_num ? cnh' cnl')]]) + (* shr *) + ##| napply (λx.match shrc (cnH ? x) with + [ pair cy' cnh' â match rcrc cy' (cnL ? x) with + [ pair cy'' cnl' â pair ⦠cy'' (mk_comp_num ? cnh' cnl')]]) + (* ror *) + ##| napply (λx.match shrc (cnH ? x) with + [ pair cy' cnh' â match rcrc cy' (cnL ? x) with + [ pair cy'' cnl' â mk_comp_num ? + (match cy'' with [ true â setMSBc + | false â λh.h ] cnh') cnl']]) + (* rcl *) + ##| napply (λcy,x.match rclc cy (cnL ? x) with + [ pair cy' cnl' â match rclc cy' (cnH ? x) with + [ pair cy'' cnh' â pair ⦠cy'' (mk_comp_num ? cnh' cnl')]]) + (* shl *) + ##| napply (λx.match shlc (cnL ? x) with + [ pair cy' cnl' â match rclc cy' (cnH ? x) with + [ pair cy'' cnh' â pair ⦠cy'' (mk_comp_num ? cnh' cnl')]]) + (* rol *) + ##| napply (λx.match shlc (cnL ? x) with + [ pair cy' cnl' â match rclc cy' (cnH ? x) with + [ pair cy'' cnh' â mk_comp_num ? + cnh' (match cy'' with [ true â setLSBc + | false â λh.h ] cnl')]]) + (* not *) + ##| napply (λx.mk_comp_num ? (notc (cnH ? x)) (notc (cnL ? x))) + (* plus_dc_dc *) + ##| napply (λcy,x,y.match plusc_dc_dc cy (cnL ? x) (cnL ? y) with + [ pair cy' cnl' â match plusc_dc_dc cy' (cnH ? x) (cnH ? y) with + [ pair cy'' cnh' â pair ⦠cy'' (mk_comp_num ? cnh' cnl')]]) + (* plus_d_dc *) + ##| napply (λx,y.match plusc_d_dc (cnL ? x) (cnL ? y) with + [ pair cy' cnl' â match plusc_dc_dc cy' (cnH ? x) (cnH ? y) with + [ pair cy'' cnh' â pair ⦠cy'' (mk_comp_num ? cnh' cnl')]]) + (* plus_dc_d *) + ##| napply (λcy,x,y.match plusc_dc_dc cy (cnL ? x) (cnL ? y) with + [ pair cy' cnl' â mk_comp_num ? (plusc_dc_d cy' (cnH ? x) (cnH ? y)) cnl']) + (* plus_d_d *) + ##| napply (λx,y.match plusc_d_dc (cnL ? x) (cnL ? y) with + [ pair cy' cnl' â mk_comp_num ? (plusc_dc_d cy' (cnH ? x) (cnH ? y)) cnl']) + (* plus_dc_c *) + ##| napply (λcy,x,y.plusc_dc_c (plusc_dc_c cy (cnL ? x) (cnL ? y)) + (cnH ? x) (cnH ? y)) + (* plus_d_c *) + ##| napply (λx,y.plusc_dc_c (plusc_d_c (cnL ? x) (cnL ? y)) + (cnH ? x) (cnH ? y)) + (* pred *) + ##| napply (λx.match (eqc c) (zeroc c) (cnL ? x) with + [ true â mk_comp_num ? (predc (cnH ? x)) (predc (cnL ? x)) + | false â mk_comp_num ? (cnH ? x) (predc (cnL ? x)) ]) + (* succ *) + ##| napply (λx.match (eqc c) (predc (zeroc c)) (cnL ? x) with + [ true â mk_comp_num ? (succc (cnH ? x)) (succc (cnL ? x)) + | false â mk_comp_num ? (cnH ? x) (succc (cnL ? x)) ]) + (* compl *) + ##| napply (λx.(match (eqc c) (zeroc c) (cnL ? x) with + [ true â mk_comp_num ? (complc (cnH ? x)) (complc (cnL ? x)) + | false â mk_comp_num ? (notc (cnH ? x)) (complc (cnL ? x)) ])) + (* abs *) + ##| napply (λx.match getMSBc (cnH ? x) with + [ true â match (eqc c) (zeroc c) (cnL ? x) with + [ true â mk_comp_num ? (complc (cnH ? x)) (complc (cnL ? x)) + | false â mk_comp_num ? (notc (cnH ? x)) (complc (cnL ? x)) ] + | false â x ]) + (* inrange *) + ##| napply (λx,inf,sup. + match (ltc (cnH ? inf) (cnH ? sup)) â + (((eqc c) (cnH ? inf) (cnH ? sup)) â (lec (cnL ? inf) (cnL ? sup))) with + [ true â and_bool | false â or_bool ] + ((ltc (cnH ? inf) (cnH ? x)) â + (((eqc c) (cnH ? inf) (cnH ? x)) â (lec (cnL ? inf) (cnL ? x)))) + ((ltc (cnH ? x) (cnH ? sup)) â + (((eqc c) (cnH ? x) (cnH ? sup)) â (lec (cnL ? x) (cnL ? sup))))) + ##] +nqed. + +unification hint 0 â S: comparable; + T â (carr S), + X â (cn_is_comparable S) + (*********************************************) ⢠+ carr X â¡ comp_num T. + +ndefinition zeroc â λx:comparable_ext.zeroc (comp_base x). +ndefinition forallc â λx:comparable_ext.forallc (comp_base x). +ndefinition eqc â λx:comparable_ext.eqc (comp_base x). +ndefinition eqc_to_eq â λx:comparable_ext.eqc_to_eq (comp_base x). +ndefinition eq_to_eqc â λx:comparable_ext.eq_to_eqc (comp_base x). +ndefinition neqc_to_neq â λx:comparable_ext.neqc_to_neq (comp_base x). +ndefinition neq_to_neqc â λx:comparable_ext.neq_to_neqc (comp_base x). +ndefinition decidable_c â λx:comparable_ext.decidable_c (comp_base x). +ndefinition symmetric_eqc â λx:comparable_ext.symmetric_eqc (comp_base x). diff --git a/helm/software/matita/contribs/ng_assembly2/num/exadecim.ma b/helm/software/matita/contribs/ng_assembly2/num/exadecim.ma new file mode 100755 index 000000000..72f81d0d2 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/exadecim.ma @@ -0,0 +1,1583 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/comp_ext.ma". +include "num/bool_lemmas.ma". +include "num/oct.ma". + +(* *********** *) +(* ESADECIMALI *) +(* *********** *) + +ninductive exadecim : Type â + x0: exadecim +| x1: exadecim +| x2: exadecim +| x3: exadecim +| x4: exadecim +| x5: exadecim +| x6: exadecim +| x7: exadecim +| x8: exadecim +| x9: exadecim +| xA: exadecim +| xB: exadecim +| xC: exadecim +| xD: exadecim +| xE: exadecim +| xF: exadecim. + +(* iteratore sugli esadecimali *) +ndefinition forall_ex â λP. + P x0 â P x1 â P x2 â P x3 â P x4 â P x5 â P x6 â P x7 â + P x8 â P x9 â P xA â P xB â P xC â P xD â P xE â P xF. + +(* operatore = *) +ndefinition eq_ex â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with [ x0 â true | _ â false ] + | x1 â match e2 with [ x1 â true | _ â false ] + | x2 â match e2 with [ x2 â true | _ â false ] + | x3 â match e2 with [ x3 â true | _ â false ] + | x4 â match e2 with [ x4 â true | _ â false ] + | x5 â match e2 with [ x5 â true | _ â false ] + | x6 â match e2 with [ x6 â true | _ â false ] + | x7 â match e2 with [ x7 â true | _ â false ] + | x8 â match e2 with [ x8 â true | _ â false ] + | x9 â match e2 with [ x9 â true | _ â false ] + | xA â match e2 with [ xA â true | _ â false ] + | xB â match e2 with [ xB â true | _ â false ] + | xC â match e2 with [ xC â true | _ â false ] + | xD â match e2 with [ xD â true | _ â false ] + | xE â match e2 with [ xE â true | _ â false ] + | xF â match e2 with [ xF â true | _ â false ] + ]. + +(* operatore < *) +ndefinition lt_ex â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with + [ x0 â false | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x1 â match e2 with + [ x0 â false | x1 â false | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x2 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x3 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x4 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x5 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x6 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x7 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x8 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x9 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | xA â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | xB â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â true | xD â true | xE â true | xF â true ] + | xC â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â true | xE â true | xF â true ] + | xD â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â true | xF â true ] + | xE â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â true ] + | xF â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + ]. + +(* operatore ⤠*) +ndefinition le_ex â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x1 â match e2 with + [ x0 â false | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x2 â match e2 with + [ x0 â false | x1 â false | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x3 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x4 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x5 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x6 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x7 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x8 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | x9 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | xA â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | xB â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â true + | xC â true | xD â true | xE â true | xF â true ] + | xC â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â true | xD â true | xE â true | xF â true ] + | xD â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â true | xE â true | xF â true ] + | xE â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â true | xF â true ] + | xF â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â true ] + ]. + +(* operatore > *) +ndefinition gt_ex â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x1 â match e2 with + [ x0 â true | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x2 â match e2 with + [ x0 â true | x1 â true | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x3 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x4 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x5 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x6 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x7 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x8 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x9 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | xA â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | xB â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | xC â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â false | xD â false | xE â false | xF â false ] + | xD â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â false | xE â false | xF â false ] + | xE â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â false | xF â false ] + | xF â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â false ] + ]. + +(* operatore ⥠*) +ndefinition ge_ex â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with + [ x0 â true | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x1 â match e2 with + [ x0 â true | x1 â true | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x2 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x3 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x4 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x5 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x6 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â false + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x7 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â false | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x8 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â false | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | x9 â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â false | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | xA â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â false + | xC â false | xD â false | xE â false | xF â false ] + | xB â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â false | xD â false | xE â false | xF â false ] + | xC â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â false | xE â false | xF â false ] + | xD â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â false | xF â false ] + | xE â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â false ] + | xF â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true + | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ] + ]. + +(* operatore and *) +ndefinition and_ex â +λe1,e2:exadecim.match e1 with + [ x0 â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x0 | x3 â x0 + | x4 â x0 | x5 â x0 | x6 â x0 | x7 â x0 + | x8 â x0 | x9 â x0 | xA â x0 | xB â x0 + | xC â x0 | xD â x0 | xE â x0 | xF â x0 ] + | x1 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x0 | x3 â x1 + | x4 â x0 | x5 â x1 | x6 â x0 | x7 â x1 + | x8 â x0 | x9 â x1 | xA â x0 | xB â x1 + | xC â x0 | xD â x1 | xE â x0 | xF â x1 ] + | x2 â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x2 | x3 â x2 + | x4 â x0 | x5 â x0 | x6 â x2 | x7 â x2 + | x8 â x0 | x9 â x0 | xA â x2 | xB â x2 + | xC â x0 | xD â x0 | xE â x2 | xF â x2 ] + | x3 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 + | x4 â x0 | x5 â x1 | x6 â x2 | x7 â x3 + | x8 â x0 | x9 â x1 | xA â x2 | xB â x3 + | xC â x0 | xD â x1 | xE â x2 | xF â x3 ] + | x4 â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x0 | x3 â x0 + | x4 â x4 | x5 â x4 | x6 â x4 | x7 â x4 + | x8 â x0 | x9 â x0 | xA â x0 | xB â x0 + | xC â x4 | xD â x4 | xE â x4 | xF â x4 ] + | x5 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x0 | x3 â x1 + | x4 â x4 | x5 â x5 | x6 â x4 | x7 â x5 + | x8 â x0 | x9 â x1 | xA â x0 | xB â x1 + | xC â x4 | xD â x5 | xE â x4 | xF â x5 ] + | x6 â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x2 | x3 â x2 + | x4 â x4 | x5 â x4 | x6 â x6 | x7 â x6 + | x8 â x0 | x9 â x0 | xA â x2 | xB â x2 + | xC â x4 | xD â x4 | xE â x6 | xF â x6 ] + | x7 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 + | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x0 | x9 â x1 | xA â x2 | xB â x3 + | xC â x4 | xD â x5 | xE â x6 | xF â x7 ] + | x8 â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x0 | x3 â x0 + | x4 â x0 | x5 â x0 | x6 â x0 | x7 â x0 + | x8 â x8 | x9 â x8 | xA â x8 | xB â x8 + | xC â x8 | xD â x8 | xE â x8 | xF â x8 ] + | x9 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x0 | x3 â x1 + | x4 â x0 | x5 â x1 | x6 â x0 | x7 â x1 + | x8 â x8 | x9 â x9 | xA â x8 | xB â x9 + | xC â x8 | xD â x9 | xE â x8 | xF â x9 ] + | xA â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x2 | x3 â x2 + | x4 â x0 | x5 â x0 | x6 â x2 | x7 â x2 + | x8 â x8 | x9 â x8 | xA â xA | xB â xA + | xC â x8 | xD â x8 | xE â xA | xF â xA ] + | xB â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 + | x4 â x0 | x5 â x1 | x6 â x2 | x7 â x3 + | x8 â x8 | x9 â x9 | xA â xA | xB â xB + | xC â x8 | xD â x9 | xE â xA | xF â xB ] + | xC â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x0 | x3 â x0 + | x4 â x4 | x5 â x4 | x6 â x4 | x7 â x4 + | x8 â x8 | x9 â x8 | xA â x8 | xB â x8 + | xC â xC | xD â xC | xE â xC | xF â xC ] + | xD â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x0 | x3 â x1 + | x4 â x4 | x5 â x5 | x6 â x4 | x7 â x5 + | x8 â x8 | x9 â x9 | xA â x8 | xB â x9 + | xC â xC | xD â xD | xE â xC | xF â xD ] + | xE â match e2 with + [ x0 â x0 | x1 â x0 | x2 â x2 | x3 â x2 + | x4 â x4 | x5 â x4 | x6 â x6 | x7 â x6 + | x8 â x8 | x9 â x8 | xA â xA | xB â xA + | xC â xC | xD â xC | xE â xE | xF â xE ] + | xF â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 + | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x8 | x9 â x9 | xA â xA | xB â xB + | xC â xC | xD â xD | xE â xE | xF â xF ] + ]. + +(* operatore or *) +ndefinition or_ex â +λe1,e2:exadecim.match e1 with + [ x0 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 + | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x8 | x9 â x9 | xA â xA | xB â xB + | xC â xC | xD â xD | xE â xE | xF â xF ] + | x1 â match e2 with + [ x0 â x1 | x1 â x1 | x2 â x3 | x3 â x3 + | x4 â x5 | x5 â x5 | x6 â x7 | x7 â x7 + | x8 â x9 | x9 â x9 | xA â xB | xB â xB + | xC â xD | xD â xD | xE â xF | xF â xF ] + | x2 â match e2 with + [ x0 â x2 | x1 â x3 | x2 â x2 | x3 â x3 + | x4 â x6 | x5 â x7 | x6 â x6 | x7 â x7 + | x8 â xA | x9 â xB | xA â xA | xB â xB + | xC â xE | xD â xF | xE â xE | xF â xF ] + | x3 â match e2 with + [ x0 â x3 | x1 â x3 | x2 â x3 | x3 â x3 + | x4 â x7 | x5 â x7 | x6 â x7 | x7 â x7 + | x8 â xB | x9 â xB | xA â xB | xB â xB + | xC â xF | xD â xF | xE â xF | xF â xF ] + | x4 â match e2 with + [ x0 â x4 | x1 â x5 | x2 â x6 | x3 â x7 + | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â xC | x9 â xD | xA â xE | xB â xF + | xC â xC | xD â xD | xE â xE | xF â xF ] + | x5 â match e2 with + [ x0 â x5 | x1 â x5 | x2 â x7 | x3 â x7 + | x4 â x5 | x5 â x5 | x6 â x7 | x7 â x7 + | x8 â xD | x9 â xD | xA â xF | xB â xF + | xC â xD | xD â xD | xE â xF | xF â xF ] + | x6 â match e2 with + [ x0 â x6 | x1 â x7 | x2 â x6 | x3 â x7 + | x4 â x6 | x5 â x7 | x6 â x6 | x7 â x7 + | x8 â xE | x9 â xF | xA â xE | xB â xF + | xC â xE | xD â xF | xE â xE | xF â xF ] + | x7 â match e2 with + [ x0 â x7 | x1 â x7 | x2 â x7 | x3 â x7 + | x4 â x7 | x5 â x7 | x6 â x7 | x7 â x7 + | x8 â xF | x9 â xF | xA â xF | xB â xF + | xC â xF | xD â xF | xE â xF | xF â xF ] + | x8 â match e2 with + [ x0 â x8 | x1 â x9 | x2 â xA | x3 â xB + | x4 â xC | x5 â xD | x6 â xE | x7 â xF + | x8 â x8 | x9 â x9 | xA â xA | xB â xB + | xC â xC | xD â xD | xE â xE | xF â xF ] + | x9 â match e2 with + [ x0 â x9 | x1 â x9 | x2 â xB | x3 â xB + | x4 â xD | x5 â xD | x6 â xF | x7 â xF + | x8 â x9 | x9 â x9 | xA â xB | xB â xB + | xC â xD | xD â xD | xE â xF | xF â xF ] + | xA â match e2 with + [ x0 â xA | x1 â xB | x2 â xA | x3 â xB + | x4 â xE | x5 â xF | x6 â xE | x7 â xF + | x8 â xA | x9 â xB | xA â xA | xB â xB + | xC â xE | xD â xF | xE â xE | xF â xF ] + | xB â match e2 with + [ x0 â xB | x1 â xB | x2 â xB | x3 â xB + | x4 â xF | x5 â xF | x6 â xF | x7 â xF + | x8 â xB | x9 â xB | xA â xB | xB â xB + | xC â xF | xD â xF | xE â xF | xF â xF ] + | xC â match e2 with + [ x0 â xC | x1 â xD | x2 â xE | x3 â xF + | x4 â xC | x5 â xD | x6 â xE | x7 â xF + | x8 â xC | x9 â xD | xA â xE | xB â xF + | xC â xC | xD â xD | xE â xE | xF â xF ] + | xD â match e2 with + [ x0 â xD | x1 â xD | x2 â xF | x3 â xF + | x4 â xD | x5 â xD | x6 â xF | x7 â xF + | x8 â xD | x9 â xD | xA â xF | xB â xF + | xC â xD | xD â xD | xE â xF | xF â xF ] + | xE â match e2 with + [ x0 â xE | x1 â xF | x2 â xE | x3 â xF + | x4 â xE | x5 â xF | x6 â xE | x7 â xF + | x8 â xE | x9 â xF | xA â xE | xB â xF + | xC â xE | xD â xF | xE â xE | xF â xF ] + | xF â match e2 with + [ x0 â xF | x1 â xF | x2 â xF | x3 â xF + | x4 â xF | x5 â xF | x6 â xF | x7 â xF + | x8 â xF | x9 â xF | xA â xF | xB â xF + | xC â xF | xD â xF | xE â xF | xF â xF ] + ]. + +(* operatore xor *) +ndefinition xor_ex â +λe1,e2:exadecim.match e1 with + [ x0 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 + | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x8 | x9 â x9 | xA â xA | xB â xB + | xC â xC | xD â xD | xE â xE | xF â xF ] + | x1 â match e2 with + [ x0 â x1 | x1 â x0 | x2 â x3 | x3 â x2 + | x4 â x5 | x5 â x4 | x6 â x7 | x7 â x6 + | x8 â x9 | x9 â x8 | xA â xB | xB â xA + | xC â xD | xD â xC | xE â xF | xF â xE ] + | x2 â match e2 with + [ x0 â x2 | x1 â x3 | x2 â x0 | x3 â x1 + | x4 â x6 | x5 â x7 | x6 â x4 | x7 â x5 + | x8 â xA | x9 â xB | xA â x8 | xB â x9 + | xC â xE | xD â xF | xE â xC | xF â xD ] + | x3 â match e2 with + [ x0 â x3 | x1 â x2 | x2 â x1 | x3 â x0 + | x4 â x7 | x5 â x6 | x6 â x5 | x7 â x4 + | x8 â xB | x9 â xA | xA â x9 | xB â x8 + | xC â xF | xD â xE | xE â xD | xF â xC ] + | x4 â match e2 with + [ x0 â x4 | x1 â x5 | x2 â x6 | x3 â x7 + | x4 â x0 | x5 â x1 | x6 â x2 | x7 â x3 + | x8 â xC | x9 â xD | xA â xE | xB â xF + | xC â x8 | xD â x9 | xE â xA | xF â xB ] + | x5 â match e2 with + [ x0 â x5 | x1 â x4 | x2 â x7 | x3 â x6 + | x4 â x1 | x5 â x0 | x6 â x3 | x7 â x2 + | x8 â xD | x9 â xC | xA â xF | xB â xE + | xC â x9 | xD â x8 | xE â xB | xF â xA ] + | x6 â match e2 with + [ x0 â x6 | x1 â x7 | x2 â x4 | x3 â x5 + | x4 â x2 | x5 â x3 | x6 â x0 | x7 â x1 + | x8 â xE | x9 â xF | xA â xC | xB â xD + | xC â xA | xD â xB | xE â x8 | xF â x9 ] + | x7 â match e2 with + [ x0 â x7 | x1 â x6 | x2 â x5 | x3 â x4 + | x4 â x3 | x5 â x2 | x6 â x1 | x7 â x0 + | x8 â xF | x9 â xE | xA â xD | xB â xC + | xC â xB | xD â xA | xE â x9 | xF â x8 ] + | x8 â match e2 with + [ x0 â x8 | x1 â x9 | x2 â xA | x3 â xB + | x4 â xC | x5 â xD | x6 â xE | x7 â xF + | x8 â x0 | x9 â x1 | xA â x2 | xB â x3 + | xC â x4 | xD â x5 | xE â x6 | xF â x7 ] + | x9 â match e2 with + [ x0 â x9 | x1 â x8 | x2 â xB | x3 â xA + | x4 â xD | x5 â xC | x6 â xF | x7 â xE + | x8 â x1 | x9 â x0 | xA â x3 | xB â x2 + | xC â x5 | xD â x4 | xE â x7 | xF â x6 ] + | xA â match e2 with + [ x0 â xA | x1 â xB | x2 â x8 | x3 â x9 + | x4 â xE | x5 â xF | x6 â xC | x7 â xD + | x8 â x2 | x9 â x3 | xA â x0 | xB â x1 + | xC â x6 | xD â x7 | xE â x4 | xF â x5 ] + | xB â match e2 with + [ x0 â xB | x1 â xA | x2 â x9 | x3 â x8 + | x4 â xF | x5 â xE | x6 â xD | x7 â xC + | x8 â x3 | x9 â x2 | xA â x1 | xB â x0 + | xC â x7 | xD â x6 | xE â x5 | xF â x4 ] + | xC â match e2 with + [ x0 â xC | x1 â xD | x2 â xE | x3 â xF + | x4 â x8 | x5 â x9 | x6 â xA | x7 â xB + | x8 â x4 | x9 â x5 | xA â x6 | xB â x7 + | xC â x0 | xD â x1 | xE â x2 | xF â x3 ] + | xD â match e2 with + [ x0 â xD | x1 â xC | x2 â xF | x3 â xE + | x4 â x9 | x5 â x8 | x6 â xB | x7 â xA + | x8 â x5 | x9 â x4 | xA â x7 | xB â x6 + | xC â x1 | xD â x0 | xE â x3 | xF â x2 ] + | xE â match e2 with + [ x0 â xE | x1 â xF | x2 â xC | x3 â xD + | x4 â xA | x5 â xB | x6 â x8 | x7 â x9 + | x8 â x6 | x9 â x7 | xA â x4 | xB â x5 + | xC â x2 | xD â x3 | xE â x0 | xF â x1 ] + | xF â match e2 with + [ x0 â xF | x1 â xE | x2 â xD | x3 â xC + | x4 â xB | x5 â xA | x6 â x9 | x7 â x8 + | x8 â x7 | x9 â x6 | xA â x5 | xB â x4 + | xC â x3 | xD â x2 | xE â x1 | xF â x0 ] + ]. + +(* operatore Most Significant Bit *) +ndefinition getMSB_ex â +λe:exadecim.match e with + [ x0 â false | x1 â false | x2 â false | x3 â false + | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â true | x9 â true | xA â true | xB â true + | xC â true | xD â true | xE â true | xF â true ]. + +ndefinition setMSB_ex â +λe:exadecim.match e with + [ x0 â x8 | x1 â x9 | x2 â xA | x3 â xB + | x4 â xC | x5 â xD | x6 â xE | x7 â xF + | x8 â x8 | x9 â x9 | xA â xA | xB â xB + | xC â xC | xD â xD | xE â xE | xF â xF ]. + +ndefinition clrMSB_ex â +λe:exadecim.match e with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 + | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x0 | x9 â x1 | xA â x2 | xB â x3 + | xC â x4 | xD â x5 | xE â x6 | xF â x7 ]. + +(* operatore Least Significant Bit *) +ndefinition getLSB_ex â +λe:exadecim.match e with + [ x0 â false | x1 â true | x2 â false | x3 â true + | x4 â false | x5 â true | x6 â false | x7 â true + | x8 â false | x9 â true | xA â false | xB â true + | xC â false | xD â true | xE â false | xF â true ]. + +ndefinition setLSB_ex â +λe:exadecim.match e with + [ x0 â x1 | x1 â x1 | x2 â x3 | x3 â x3 + | x4 â x5 | x5 â x5 | x6 â x7 | x7 â x7 + | x8 â x9 | x9 â x9 | xA â xB | xB â xB + | xC â xD | xD â xD | xE â xF | xF â xF ]. + +ndefinition clrLSB_ex â +λe:exadecim.match e with + [ x0 â x0 | x1 â x0 | x2 â x2 | x3 â x2 + | x4 â x4 | x5 â x4 | x6 â x6 | x7 â x6 + | x8 â x8 | x9 â x8 | xA â xA | xB â xA + | xC â xC | xD â xC | xE â xE | xF â xE ]. + +(* operatore rotazione destra con carry *) +ndefinition rcr_ex â +λc:bool.λe:exadecim.match c with + [ true â match e with + [ x0 â pair ⦠false x8 | x1 â pair ⦠true x8 + | x2 â pair ⦠false x9 | x3 â pair ⦠true x9 + | x4 â pair ⦠false xA | x5 â pair ⦠true xA + | x6 â pair ⦠false xB | x7 â pair ⦠true xB + | x8 â pair ⦠false xC | x9 â pair ⦠true xC + | xA â pair ⦠false xD | xB â pair ⦠true xD + | xC â pair ⦠false xE | xD â pair ⦠true xE + | xE â pair ⦠false xF | xF â pair ⦠true xF ] + | false â match e with + [ x0 â pair ⦠false x0 | x1 â pair ⦠true x0 + | x2 â pair ⦠false x1 | x3 â pair ⦠true x1 + | x4 â pair ⦠false x2 | x5 â pair ⦠true x2 + | x6 â pair ⦠false x3 | x7 â pair ⦠true x3 + | x8 â pair ⦠false x4 | x9 â pair ⦠true x4 + | xA â pair ⦠false x5 | xB â pair ⦠true x5 + | xC â pair ⦠false x6 | xD â pair ⦠true x6 + | xE â pair ⦠false x7 | xF â pair ⦠true x7 ] + ]. + +(* operatore shift destro *) +ndefinition shr_ex â +λe:exadecim.match e with + [ x0 â pair ⦠false x0 | x1 â pair ⦠true x0 + | x2 â pair ⦠false x1 | x3 â pair ⦠true x1 + | x4 â pair ⦠false x2 | x5 â pair ⦠true x2 + | x6 â pair ⦠false x3 | x7 â pair ⦠true x3 + | x8 â pair ⦠false x4 | x9 â pair ⦠true x4 + | xA â pair ⦠false x5 | xB â pair ⦠true x5 + | xC â pair ⦠false x6 | xD â pair ⦠true x6 + | xE â pair ⦠false x7 | xF â pair ⦠true x7 ]. + +(* operatore rotazione destra *) +ndefinition ror_ex â +λe:exadecim.match e with + [ x0 â x0 | x1 â x8 | x2 â x1 | x3 â x9 + | x4 â x2 | x5 â xA | x6 â x3 | x7 â xB + | x8 â x4 | x9 â xC | xA â x5 | xB â xD + | xC â x6 | xD â xE | xE â x7 | xF â xF ]. + +(* operatore rotazione sinistra con carry *) +ndefinition rcl_ex â +λc:bool.λe:exadecim.match c with + [ true â match e with + [ x0 â pair ⦠false x1 | x1 â pair ⦠false x3 + | x2 â pair ⦠false x5 | x3 â pair ⦠false x7 + | x4 â pair ⦠false x9 | x5 â pair ⦠false xB + | x6 â pair ⦠false xD | x7 â pair ⦠false xF + | x8 â pair ⦠true x1 | x9 â pair ⦠true x3 + | xA â pair ⦠true x5 | xB â pair ⦠true x7 + | xC â pair ⦠true x9 | xD â pair ⦠true xB + | xE â pair ⦠true xD | xF â pair ⦠true xF ] + | false â match e with + [ x0 â pair ⦠false x0 | x1 â pair ⦠false x2 + | x2 â pair ⦠false x4 | x3 â pair ⦠false x6 + | x4 â pair ⦠false x8 | x5 â pair ⦠false xA + | x6 â pair ⦠false xC | x7 â pair ⦠false xE + | x8 â pair ⦠true x0 | x9 â pair ⦠true x2 + | xA â pair ⦠true x4 | xB â pair ⦠true x6 + | xC â pair ⦠true x8 | xD â pair ⦠true xA + | xE â pair ⦠true xC | xF â pair ⦠true xE ] + ]. + +(* operatore shift sinistro *) +ndefinition shl_ex â +λe:exadecim.match e with + [ x0 â pair ⦠false x0 | x1 â pair ⦠false x2 + | x2 â pair ⦠false x4 | x3 â pair ⦠false x6 + | x4 â pair ⦠false x8 | x5 â pair ⦠false xA + | x6 â pair ⦠false xC | x7 â pair ⦠false xE + | x8 â pair ⦠true x0 | x9 â pair ⦠true x2 + | xA â pair ⦠true x4 | xB â pair ⦠true x6 + | xC â pair ⦠true x8 | xD â pair ⦠true xA + | xE â pair ⦠true xC | xF â pair ⦠true xE ]. + +(* operatore rotazione sinistra *) +ndefinition rol_ex â +λe:exadecim.match e with + [ x0 â x0 | x1 â x2 | x2 â x4 | x3 â x6 + | x4 â x8 | x5 â xA | x6 â xC | x7 â xE + | x8 â x1 | x9 â x3 | xA â x5 | xB â x7 + | xC â x9 | xD â xB | xE â xD | xF â xF ]. + +(* operatore not/complemento a 1 *) +ndefinition not_ex â +λe:exadecim.match e with + [ x0 â xF | x1 â xE | x2 â xD | x3 â xC + | x4 â xB | x5 â xA | x6 â x9 | x7 â x8 + | x8 â x7 | x9 â x6 | xA â x5 | xB â x4 + | xC â x3 | xD â x2 | xE â x1 | xF â x0 ]. + +(* operatore somma con data+carry â data+carry *) +ndefinition plus_ex_dc_dc â +λc:bool.λe1,e2:exadecim. + match c with + [ true â match e1 with + [ x0 â match e2 with + [ x0 â pair ⦠false x1 | x1 â pair ⦠false x2 | x2 â pair ⦠false x3 | x3 â pair ⦠false x4 + | x4 â pair ⦠false x5 | x5 â pair ⦠false x6 | x6 â pair ⦠false x7 | x7 â pair ⦠false x8 + | x8 â pair ⦠false x9 | x9 â pair ⦠false xA | xA â pair ⦠false xB | xB â pair ⦠false xC + | xC â pair ⦠false xD | xD â pair ⦠false xE | xE â pair ⦠false xF | xF â pair ⦠true x0 ] + | x1 â match e2 with + [ x0 â pair ⦠false x2 | x1 â pair ⦠false x3 | x2 â pair ⦠false x4 | x3 â pair ⦠false x5 + | x4 â pair ⦠false x6 | x5 â pair ⦠false x7 | x6 â pair ⦠false x8 | x7 â pair ⦠false x9 + | x8 â pair ⦠false xA | x9 â pair ⦠false xB | xA â pair ⦠false xC | xB â pair ⦠false xD + | xC â pair ⦠false xE | xD â pair ⦠false xF | xE â pair ⦠true x0 | xF â pair ⦠true x1 ] + | x2 â match e2 with + [ x0 â pair ⦠false x3 | x1 â pair ⦠false x4 | x2 â pair ⦠false x5 | x3 â pair ⦠false x6 + | x4 â pair ⦠false x7 | x5 â pair ⦠false x8 | x6 â pair ⦠false x9 | x7 â pair ⦠false xA + | x8 â pair ⦠false xB | x9 â pair ⦠false xC | xA â pair ⦠false xD | xB â pair ⦠false xE + | xC â pair ⦠false xF | xD â pair ⦠true x0 | xE â pair ⦠true x1 | xF â pair ⦠true x2 ] + | x3 â match e2 with + [ x0 â pair ⦠false x4 | x1 â pair ⦠false x5 | x2 â pair ⦠false x6 | x3 â pair ⦠false x7 + | x4 â pair ⦠false x8 | x5 â pair ⦠false x9 | x6 â pair ⦠false xA | x7 â pair ⦠false xB + | x8 â pair ⦠false xC | x9 â pair ⦠false xD | xA â pair ⦠false xE | xB â pair ⦠false xF + | xC â pair ⦠true x0 | xD â pair ⦠true x1 | xE â pair ⦠true x2 | xF â pair ⦠true x3 ] + | x4 â match e2 with + [ x0 â pair ⦠false x5 | x1 â pair ⦠false x6 | x2 â pair ⦠false x7 | x3 â pair ⦠false x8 + | x4 â pair ⦠false x9 | x5 â pair ⦠false xA | x6 â pair ⦠false xB | x7 â pair ⦠false xC + | x8 â pair ⦠false xD | x9 â pair ⦠false xE | xA â pair ⦠false xF | xB â pair ⦠true x0 + | xC â pair ⦠true x1 | xD â pair ⦠true x2 | xE â pair ⦠true x3 | xF â pair ⦠true x4 ] + | x5 â match e2 with + [ x0 â pair ⦠false x6 | x1 â pair ⦠false x7 | x2 â pair ⦠false x8 | x3 â pair ⦠false x9 + | x4 â pair ⦠false xA | x5 â pair ⦠false xB | x6 â pair ⦠false xC | x7 â pair ⦠false xD + | x8 â pair ⦠false xE | x9 â pair ⦠false xF | xA â pair ⦠true x0 | xB â pair ⦠true x1 + | xC â pair ⦠true x2 | xD â pair ⦠true x3 | xE â pair ⦠true x4 | xF â pair ⦠true x5 ] + | x6 â match e2 with + [ x0 â pair ⦠false x7 | x1 â pair ⦠false x8 | x2 â pair ⦠false x9 | x3 â pair ⦠false xA + | x4 â pair ⦠false xB | x5 â pair ⦠false xC | x6 â pair ⦠false xD | x7 â pair ⦠false xE + | x8 â pair ⦠false xF | x9 â pair ⦠true x0 | xA â pair ⦠true x1 | xB â pair ⦠true x2 + | xC â pair ⦠true x3 | xD â pair ⦠true x4 | xE â pair ⦠true x5 | xF â pair ⦠true x6 ] + | x7 â match e2 with + [ x0 â pair ⦠false x8 | x1 â pair ⦠false x9 | x2 â pair ⦠false xA | x3 â pair ⦠false xB + | x4 â pair ⦠false xC | x5 â pair ⦠false xD | x6 â pair ⦠false xE | x7 â pair ⦠false xF + | x8 â pair ⦠true x0 | x9 â pair ⦠true x1 | xA â pair ⦠true x2 | xB â pair ⦠true x3 + | xC â pair ⦠true x4 | xD â pair ⦠true x5 | xE â pair ⦠true x6 | xF â pair ⦠true x7 ] + | x8 â match e2 with + [ x0 â pair ⦠false x9 | x1 â pair ⦠false xA | x2 â pair ⦠false xB | x3 â pair ⦠false xC + | x4 â pair ⦠false xD | x5 â pair ⦠false xE | x6 â pair ⦠false xF | x7 â pair ⦠true x0 + | x8 â pair ⦠true x1 | x9 â pair ⦠true x2 | xA â pair ⦠true x3 | xB â pair ⦠true x4 + | xC â pair ⦠true x5 | xD â pair ⦠true x6 | xE â pair ⦠true x7 | xF â pair ⦠true x8 ] + | x9 â match e2 with + [ x0 â pair ⦠false xA | x1 â pair ⦠false xB | x2 â pair ⦠false xC | x3 â pair ⦠false xD + | x4 â pair ⦠false xE | x5 â pair ⦠false xF | x6 â pair ⦠true x0 | x7 â pair ⦠true x1 + | x8 â pair ⦠true x2 | x9 â pair ⦠true x3 | xA â pair ⦠true x4 | xB â pair ⦠true x5 + | xC â pair ⦠true x6 | xD â pair ⦠true x7 | xE â pair ⦠true x8 | xF â pair ⦠true x9 ] + | xA â match e2 with + [ x0 â pair ⦠false xB | x1 â pair ⦠false xC | x2 â pair ⦠false xD | x3 â pair ⦠false xE + | x4 â pair ⦠false xF | x5 â pair ⦠true x0 | x6 â pair ⦠true x1 | x7 â pair ⦠true x2 + | x8 â pair ⦠true x3 | x9 â pair ⦠true x4 | xA â pair ⦠true x5 | xB â pair ⦠true x6 + | xC â pair ⦠true x7 | xD â pair ⦠true x8 | xE â pair ⦠true x9 | xF â pair ⦠true xA ] + | xB â match e2 with + [ x0 â pair ⦠false xC | x1 â pair ⦠false xD | x2 â pair ⦠false xE | x3 â pair ⦠false xF + | x4 â pair ⦠true x0 | x5 â pair ⦠true x1 | x6 â pair ⦠true x2 | x7 â pair ⦠true x3 + | x8 â pair ⦠true x4 | x9 â pair ⦠true x5 | xA â pair ⦠true x6 | xB â pair ⦠true x7 + | xC â pair ⦠true x8 | xD â pair ⦠true x9 | xE â pair ⦠true xA | xF â pair ⦠true xB ] + | xC â match e2 with + [ x0 â pair ⦠false xD | x1 â pair ⦠false xE | x2 â pair ⦠false xF | x3 â pair ⦠true x0 + | x4 â pair ⦠true x1 | x5 â pair ⦠true x2 | x6 â pair ⦠true x3 | x7 â pair ⦠true x4 + | x8 â pair ⦠true x5 | x9 â pair ⦠true x6 | xA â pair ⦠true x7 | xB â pair ⦠true x8 + | xC â pair ⦠true x9 | xD â pair ⦠true xA | xE â pair ⦠true xB | xF â pair ⦠true xC ] + | xD â match e2 with + [ x0 â pair ⦠false xE | x1 â pair ⦠false xF | x2 â pair ⦠true x0 | x3 â pair ⦠true x1 + | x4 â pair ⦠true x2 | x5 â pair ⦠true x3 | x6 â pair ⦠true x4 | x7 â pair ⦠true x5 + | x8 â pair ⦠true x6 | x9 â pair ⦠true x7 | xA â pair ⦠true x8 | xB â pair ⦠true x9 + | xC â pair ⦠true xA | xD â pair ⦠true xB | xE â pair ⦠true xC | xF â pair ⦠true xD ] + | xE â match e2 with + [ x0 â pair ⦠false xF | x1 â pair ⦠true x0 | x2 â pair ⦠true x1 | x3 â pair ⦠true x2 + | x4 â pair ⦠true x3 | x5 â pair ⦠true x4 | x6 â pair ⦠true x5 | x7 â pair ⦠true x6 + | x8 â pair ⦠true x7 | x9 â pair ⦠true x8 | xA â pair ⦠true x9 | xB â pair ⦠true xA + | xC â pair ⦠true xB | xD â pair ⦠true xC | xE â pair ⦠true xD | xF â pair ⦠true xE ] + | xF â match e2 with + [ x0 â pair ⦠true x0 | x1 â pair ⦠true x1 | x2 â pair ⦠true x2 | x3 â pair ⦠true x3 + | x4 â pair ⦠true x4 | x5 â pair ⦠true x5 | x6 â pair ⦠true x6 | x7 â pair ⦠true x7 + | x8 â pair ⦠true x8 | x9 â pair ⦠true x9 | xA â pair ⦠true xA | xB â pair ⦠true xB + | xC â pair ⦠true xC | xD â pair ⦠true xD | xE â pair ⦠true xE | xF â pair ⦠true xF ] + ] + | false â match e1 with + [ x0 â match e2 with + [ x0 â pair ⦠false x0 | x1 â pair ⦠false x1 | x2 â pair ⦠false x2 | x3 â pair ⦠false x3 + | x4 â pair ⦠false x4 | x5 â pair ⦠false x5 | x6 â pair ⦠false x6 | x7 â pair ⦠false x7 + | x8 â pair ⦠false x8 | x9 â pair ⦠false x9 | xA â pair ⦠false xA | xB â pair ⦠false xB + | xC â pair ⦠false xC | xD â pair ⦠false xD | xE â pair ⦠false xE | xF â pair ⦠false xF ] + | x1 â match e2 with + [ x0 â pair ⦠false x1 | x1 â pair ⦠false x2 | x2 â pair ⦠false x3 | x3 â pair ⦠false x4 + | x4 â pair ⦠false x5 | x5 â pair ⦠false x6 | x6 â pair ⦠false x7 | x7 â pair ⦠false x8 + | x8 â pair ⦠false x9 | x9 â pair ⦠false xA | xA â pair ⦠false xB | xB â pair ⦠false xC + | xC â pair ⦠false xD | xD â pair ⦠false xE | xE â pair ⦠false xF | xF â pair ⦠true x0 ] + | x2 â match e2 with + [ x0 â pair ⦠false x2 | x1 â pair ⦠false x3 | x2 â pair ⦠false x4 | x3 â pair ⦠false x5 + | x4 â pair ⦠false x6 | x5 â pair ⦠false x7 | x6 â pair ⦠false x8 | x7 â pair ⦠false x9 + | x8 â pair ⦠false xA | x9 â pair ⦠false xB | xA â pair ⦠false xC | xB â pair ⦠false xD + | xC â pair ⦠false xE | xD â pair ⦠false xF | xE â pair ⦠true x0 | xF â pair ⦠true x1 ] + | x3 â match e2 with + [ x0 â pair ⦠false x3 | x1 â pair ⦠false x4 | x2 â pair ⦠false x5 | x3 â pair ⦠false x6 + | x4 â pair ⦠false x7 | x5 â pair ⦠false x8 | x6 â pair ⦠false x9 | x7 â pair ⦠false xA + | x8 â pair ⦠false xB | x9 â pair ⦠false xC | xA â pair ⦠false xD | xB â pair ⦠false xE + | xC â pair ⦠false xF | xD â pair ⦠true x0 | xE â pair ⦠true x1 | xF â pair ⦠true x2 ] + | x4 â match e2 with + [ x0 â pair ⦠false x4 | x1 â pair ⦠false x5 | x2 â pair ⦠false x6 | x3 â pair ⦠false x7 + | x4 â pair ⦠false x8 | x5 â pair ⦠false x9 | x6 â pair ⦠false xA | x7 â pair ⦠false xB + | x8 â pair ⦠false xC | x9 â pair ⦠false xD | xA â pair ⦠false xE | xB â pair ⦠false xF + | xC â pair ⦠true x0 | xD â pair ⦠true x1 | xE â pair ⦠true x2 | xF â pair ⦠true x3 ] + | x5 â match e2 with + [ x0 â pair ⦠false x5 | x1 â pair ⦠false x6 | x2 â pair ⦠false x7 | x3 â pair ⦠false x8 + | x4 â pair ⦠false x9 | x5 â pair ⦠false xA | x6 â pair ⦠false xB | x7 â pair ⦠false xC + | x8 â pair ⦠false xD | x9 â pair ⦠false xE | xA â pair ⦠false xF | xB â pair ⦠true x0 + | xC â pair ⦠true x1 | xD â pair ⦠true x2 | xE â pair ⦠true x3 | xF â pair ⦠true x4 ] + | x6 â match e2 with + [ x0 â pair ⦠false x6 | x1 â pair ⦠false x7 | x2 â pair ⦠false x8 | x3 â pair ⦠false x9 + | x4 â pair ⦠false xA | x5 â pair ⦠false xB | x6 â pair ⦠false xC | x7 â pair ⦠false xD + | x8 â pair ⦠false xE | x9 â pair ⦠false xF | xA â pair ⦠true x0 | xB â pair ⦠true x1 + | xC â pair ⦠true x2 | xD â pair ⦠true x3 | xE â pair ⦠true x4 | xF â pair ⦠true x5 ] + | x7 â match e2 with + [ x0 â pair ⦠false x7 | x1 â pair ⦠false x8 | x2 â pair ⦠false x9 | x3 â pair ⦠false xA + | x4 â pair ⦠false xB | x5 â pair ⦠false xC | x6 â pair ⦠false xD | x7 â pair ⦠false xE + | x8 â pair ⦠false xF | x9 â pair ⦠true x0 | xA â pair ⦠true x1 | xB â pair ⦠true x2 + | xC â pair ⦠true x3 | xD â pair ⦠true x4 | xE â pair ⦠true x5 | xF â pair ⦠true x6 ] + | x8 â match e2 with + [ x0 â pair ⦠false x8 | x1 â pair ⦠false x9 | x2 â pair ⦠false xA | x3 â pair ⦠false xB + | x4 â pair ⦠false xC | x5 â pair ⦠false xD | x6 â pair ⦠false xE | x7 â pair ⦠false xF + | x8 â pair ⦠true x0 | x9 â pair ⦠true x1 | xA â pair ⦠true x2 | xB â pair ⦠true x3 + | xC â pair ⦠true x4 | xD â pair ⦠true x5 | xE â pair ⦠true x6 | xF â pair ⦠true x7 ] + | x9 â match e2 with + [ x0 â pair ⦠false x9 | x1 â pair ⦠false xA | x2 â pair ⦠false xB | x3 â pair ⦠false xC + | x4 â pair ⦠false xD | x5 â pair ⦠false xE | x6 â pair ⦠false xF | x7 â pair ⦠true x0 + | x8 â pair ⦠true x1 | x9 â pair ⦠true x2 | xA â pair ⦠true x3 | xB â pair ⦠true x4 + | xC â pair ⦠true x5 | xD â pair ⦠true x6 | xE â pair ⦠true x7 | xF â pair ⦠true x8 ] + | xA â match e2 with + [ x0 â pair ⦠false xA | x1 â pair ⦠false xB | x2 â pair ⦠false xC | x3 â pair ⦠false xD + | x4 â pair ⦠false xE | x5 â pair ⦠false xF | x6 â pair ⦠true x0 | x7 â pair ⦠true x1 + | x8 â pair ⦠true x2 | x9 â pair ⦠true x3 | xA â pair ⦠true x4 | xB â pair ⦠true x5 + | xC â pair ⦠true x6 | xD â pair ⦠true x7 | xE â pair ⦠true x8 | xF â pair ⦠true x9 ] + | xB â match e2 with + [ x0 â pair ⦠false xB | x1 â pair ⦠false xC | x2 â pair ⦠false xD | x3 â pair ⦠false xE + | x4 â pair ⦠false xF | x5 â pair ⦠true x0 | x6 â pair ⦠true x1 | x7 â pair ⦠true x2 + | x8 â pair ⦠true x3 | x9 â pair ⦠true x4 | xA â pair ⦠true x5 | xB â pair ⦠true x6 + | xC â pair ⦠true x7 | xD â pair ⦠true x8 | xE â pair ⦠true x9 | xF â pair ⦠true xA ] + | xC â match e2 with + [ x0 â pair ⦠false xC | x1 â pair ⦠false xD | x2 â pair ⦠false xE | x3 â pair ⦠false xF + | x4 â pair ⦠true x0 | x5 â pair ⦠true x1 | x6 â pair ⦠true x2 | x7 â pair ⦠true x3 + | x8 â pair ⦠true x4 | x9 â pair ⦠true x5 | xA â pair ⦠true x6 | xB â pair ⦠true x7 + | xC â pair ⦠true x8 | xD â pair ⦠true x9 | xE â pair ⦠true xA | xF â pair ⦠true xB ] + | xD â match e2 with + [ x0 â pair ⦠false xD | x1 â pair ⦠false xE | x2 â pair ⦠false xF | x3 â pair ⦠true x0 + | x4 â pair ⦠true x1 | x5 â pair ⦠true x2 | x6 â pair ⦠true x3 | x7 â pair ⦠true x4 + | x8 â pair ⦠true x5 | x9 â pair ⦠true x6 | xA â pair ⦠true x7 | xB â pair ⦠true x8 + | xC â pair ⦠true x9 | xD â pair ⦠true xA | xE â pair ⦠true xB | xF â pair ⦠true xC ] + | xE â match e2 with + [ x0 â pair ⦠false xE | x1 â pair ⦠false xF | x2 â pair ⦠true x0 | x3 â pair ⦠true x1 + | x4 â pair ⦠true x2 | x5 â pair ⦠true x3 | x6 â pair ⦠true x4 | x7 â pair ⦠true x5 + | x8 â pair ⦠true x6 | x9 â pair ⦠true x7 | xA â pair ⦠true x8 | xB â pair ⦠true x9 + | xC â pair ⦠true xA | xD â pair ⦠true xB | xE â pair ⦠true xC | xF â pair ⦠true xD ] + | xF â match e2 with + [ x0 â pair ⦠false xF | x1 â pair ⦠true x0 | x2 â pair ⦠true x1 | x3 â pair ⦠true x2 + | x4 â pair ⦠true x3 | x5 â pair ⦠true x4 | x6 â pair ⦠true x5 | x7 â pair ⦠true x6 + | x8 â pair ⦠true x7 | x9 â pair ⦠true x8 | xA â pair ⦠true x9 | xB â pair ⦠true xA + | xC â pair ⦠true xB | xD â pair ⦠true xC | xE â pair ⦠true xD | xF â pair ⦠true xE ] + ]]. + +(* operatore somma con data â data+carry *) +ndefinition plus_ex_d_dc â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with + [ x0 â pair ⦠false x0 | x1 â pair ⦠false x1 | x2 â pair ⦠false x2 | x3 â pair ⦠false x3 + | x4 â pair ⦠false x4 | x5 â pair ⦠false x5 | x6 â pair ⦠false x6 | x7 â pair ⦠false x7 + | x8 â pair ⦠false x8 | x9 â pair ⦠false x9 | xA â pair ⦠false xA | xB â pair ⦠false xB + | xC â pair ⦠false xC | xD â pair ⦠false xD | xE â pair ⦠false xE | xF â pair ⦠false xF ] + | x1 â match e2 with + [ x0 â pair ⦠false x1 | x1 â pair ⦠false x2 | x2 â pair ⦠false x3 | x3 â pair ⦠false x4 + | x4 â pair ⦠false x5 | x5 â pair ⦠false x6 | x6 â pair ⦠false x7 | x7 â pair ⦠false x8 + | x8 â pair ⦠false x9 | x9 â pair ⦠false xA | xA â pair ⦠false xB | xB â pair ⦠false xC + | xC â pair ⦠false xD | xD â pair ⦠false xE | xE â pair ⦠false xF | xF â pair ⦠true x0 ] + | x2 â match e2 with + [ x0 â pair ⦠false x2 | x1 â pair ⦠false x3 | x2 â pair ⦠false x4 | x3 â pair ⦠false x5 + | x4 â pair ⦠false x6 | x5 â pair ⦠false x7 | x6 â pair ⦠false x8 | x7 â pair ⦠false x9 + | x8 â pair ⦠false xA | x9 â pair ⦠false xB | xA â pair ⦠false xC | xB â pair ⦠false xD + | xC â pair ⦠false xE | xD â pair ⦠false xF | xE â pair ⦠true x0 | xF â pair ⦠true x1 ] + | x3 â match e2 with + [ x0 â pair ⦠false x3 | x1 â pair ⦠false x4 | x2 â pair ⦠false x5 | x3 â pair ⦠false x6 + | x4 â pair ⦠false x7 | x5 â pair ⦠false x8 | x6 â pair ⦠false x9 | x7 â pair ⦠false xA + | x8 â pair ⦠false xB | x9 â pair ⦠false xC | xA â pair ⦠false xD | xB â pair ⦠false xE + | xC â pair ⦠false xF | xD â pair ⦠true x0 | xE â pair ⦠true x1 | xF â pair ⦠true x2 ] + | x4 â match e2 with + [ x0 â pair ⦠false x4 | x1 â pair ⦠false x5 | x2 â pair ⦠false x6 | x3 â pair ⦠false x7 + | x4 â pair ⦠false x8 | x5 â pair ⦠false x9 | x6 â pair ⦠false xA | x7 â pair ⦠false xB + | x8 â pair ⦠false xC | x9 â pair ⦠false xD | xA â pair ⦠false xE | xB â pair ⦠false xF + | xC â pair ⦠true x0 | xD â pair ⦠true x1 | xE â pair ⦠true x2 | xF â pair ⦠true x3 ] + | x5 â match e2 with + [ x0 â pair ⦠false x5 | x1 â pair ⦠false x6 | x2 â pair ⦠false x7 | x3 â pair ⦠false x8 + | x4 â pair ⦠false x9 | x5 â pair ⦠false xA | x6 â pair ⦠false xB | x7 â pair ⦠false xC + | x8 â pair ⦠false xD | x9 â pair ⦠false xE | xA â pair ⦠false xF | xB â pair ⦠true x0 + | xC â pair ⦠true x1 | xD â pair ⦠true x2 | xE â pair ⦠true x3 | xF â pair ⦠true x4 ] + | x6 â match e2 with + [ x0 â pair ⦠false x6 | x1 â pair ⦠false x7 | x2 â pair ⦠false x8 | x3 â pair ⦠false x9 + | x4 â pair ⦠false xA | x5 â pair ⦠false xB | x6 â pair ⦠false xC | x7 â pair ⦠false xD + | x8 â pair ⦠false xE | x9 â pair ⦠false xF | xA â pair ⦠true x0 | xB â pair ⦠true x1 + | xC â pair ⦠true x2 | xD â pair ⦠true x3 | xE â pair ⦠true x4 | xF â pair ⦠true x5 ] + | x7 â match e2 with + [ x0 â pair ⦠false x7 | x1 â pair ⦠false x8 | x2 â pair ⦠false x9 | x3 â pair ⦠false xA + | x4 â pair ⦠false xB | x5 â pair ⦠false xC | x6 â pair ⦠false xD | x7 â pair ⦠false xE + | x8 â pair ⦠false xF | x9 â pair ⦠true x0 | xA â pair ⦠true x1 | xB â pair ⦠true x2 + | xC â pair ⦠true x3 | xD â pair ⦠true x4 | xE â pair ⦠true x5 | xF â pair ⦠true x6 ] + | x8 â match e2 with + [ x0 â pair ⦠false x8 | x1 â pair ⦠false x9 | x2 â pair ⦠false xA | x3 â pair ⦠false xB + | x4 â pair ⦠false xC | x5 â pair ⦠false xD | x6 â pair ⦠false xE | x7 â pair ⦠false xF + | x8 â pair ⦠true x0 | x9 â pair ⦠true x1 | xA â pair ⦠true x2 | xB â pair ⦠true x3 + | xC â pair ⦠true x4 | xD â pair ⦠true x5 | xE â pair ⦠true x6 | xF â pair ⦠true x7 ] + | x9 â match e2 with + [ x0 â pair ⦠false x9 | x1 â pair ⦠false xA | x2 â pair ⦠false xB | x3 â pair ⦠false xC + | x4 â pair ⦠false xD | x5 â pair ⦠false xE | x6 â pair ⦠false xF | x7 â pair ⦠true x0 + | x8 â pair ⦠true x1 | x9 â pair ⦠true x2 | xA â pair ⦠true x3 | xB â pair ⦠true x4 + | xC â pair ⦠true x5 | xD â pair ⦠true x6 | xE â pair ⦠true x7 | xF â pair ⦠true x8 ] + | xA â match e2 with + [ x0 â pair ⦠false xA | x1 â pair ⦠false xB | x2 â pair ⦠false xC | x3 â pair ⦠false xD + | x4 â pair ⦠false xE | x5 â pair ⦠false xF | x6 â pair ⦠true x0 | x7 â pair ⦠true x1 + | x8 â pair ⦠true x2 | x9 â pair ⦠true x3 | xA â pair ⦠true x4 | xB â pair ⦠true x5 + | xC â pair ⦠true x6 | xD â pair ⦠true x7 | xE â pair ⦠true x8 | xF â pair ⦠true x9 ] + | xB â match e2 with + [ x0 â pair ⦠false xB | x1 â pair ⦠false xC | x2 â pair ⦠false xD | x3 â pair ⦠false xE + | x4 â pair ⦠false xF | x5 â pair ⦠true x0 | x6 â pair ⦠true x1 | x7 â pair ⦠true x2 + | x8 â pair ⦠true x3 | x9 â pair ⦠true x4 | xA â pair ⦠true x5 | xB â pair ⦠true x6 + | xC â pair ⦠true x7 | xD â pair ⦠true x8 | xE â pair ⦠true x9 | xF â pair ⦠true xA ] + | xC â match e2 with + [ x0 â pair ⦠false xC | x1 â pair ⦠false xD | x2 â pair ⦠false xE | x3 â pair ⦠false xF + | x4 â pair ⦠true x0 | x5 â pair ⦠true x1 | x6 â pair ⦠true x2 | x7 â pair ⦠true x3 + | x8 â pair ⦠true x4 | x9 â pair ⦠true x5 | xA â pair ⦠true x6 | xB â pair ⦠true x7 + | xC â pair ⦠true x8 | xD â pair ⦠true x9 | xE â pair ⦠true xA | xF â pair ⦠true xB ] + | xD â match e2 with + [ x0 â pair ⦠false xD | x1 â pair ⦠false xE | x2 â pair ⦠false xF | x3 â pair ⦠true x0 + | x4 â pair ⦠true x1 | x5 â pair ⦠true x2 | x6 â pair ⦠true x3 | x7 â pair ⦠true x4 + | x8 â pair ⦠true x5 | x9 â pair ⦠true x6 | xA â pair ⦠true x7 | xB â pair ⦠true x8 + | xC â pair ⦠true x9 | xD â pair ⦠true xA | xE â pair ⦠true xB | xF â pair ⦠true xC ] + | xE â match e2 with + [ x0 â pair ⦠false xE | x1 â pair ⦠false xF | x2 â pair ⦠true x0 | x3 â pair ⦠true x1 + | x4 â pair ⦠true x2 | x5 â pair ⦠true x3 | x6 â pair ⦠true x4 | x7 â pair ⦠true x5 + | x8 â pair ⦠true x6 | x9 â pair ⦠true x7 | xA â pair ⦠true x8 | xB â pair ⦠true x9 + | xC â pair ⦠true xA | xD â pair ⦠true xB | xE â pair ⦠true xC | xF â pair ⦠true xD ] + | xF â match e2 with + [ x0 â pair ⦠false xF | x1 â pair ⦠true x0 | x2 â pair ⦠true x1 | x3 â pair ⦠true x2 + | x4 â pair ⦠true x3 | x5 â pair ⦠true x4 | x6 â pair ⦠true x5 | x7 â pair ⦠true x6 + | x8 â pair ⦠true x7 | x9 â pair ⦠true x8 | xA â pair ⦠true x9 | xB â pair ⦠true xA + | xC â pair ⦠true xB | xD â pair ⦠true xC | xE â pair ⦠true xD | xF â pair ⦠true xE ] + ]. + +(* operatore somma con data+carry â data *) +ndefinition plus_ex_dc_d â +λc:bool.λe1,e2:exadecim. + match c with + [ true â match e1 with + [ x0 â match e2 with + [ x0 â x1 | x1 â x2 | x2 â x3 | x3 â x4 | x4 â x5 | x5 â x6 | x6 â x7 | x7 â x8 + | x8 â x9 | x9 â xA | xA â xB | xB â xC | xC â xD | xD â xE | xE â xF | xF â x0 ] + | x1 â match e2 with + [ x0 â x2 | x1 â x3 | x2 â x4 | x3 â x5 | x4 â x6 | x5 â x7 | x6 â x8 | x7 â x9 + | x8 â xA | x9 â xB | xA â xC | xB â xD | xC â xE | xD â xF | xE â x0 | xF â x1 ] + | x2 â match e2 with + [ x0 â x3 | x1 â x4 | x2 â x5 | x3 â x6 | x4 â x7 | x5 â x8 | x6 â x9 | x7 â xA + | x8 â xB | x9 â xC | xA â xD | xB â xE | xC â xF | xD â x0 | xE â x1 | xF â x2 ] + | x3 â match e2 with + [ x0 â x4 | x1 â x5 | x2 â x6 | x3 â x7 | x4 â x8 | x5 â x9 | x6 â xA | x7 â xB + | x8 â xC | x9 â xD | xA â xE | xB â xF | xC â x0 | xD â x1 | xE â x2 | xF â x3 ] + | x4 â match e2 with + [ x0 â x5 | x1 â x6 | x2 â x7 | x3 â x8 | x4 â x9 | x5 â xA | x6 â xB | x7 â xC + | x8 â xD | x9 â xE | xA â xF | xB â x0 | xC â x1 | xD â x2 | xE â x3 | xF â x4 ] + | x5 â match e2 with + [ x0 â x6 | x1 â x7 | x2 â x8 | x3 â x9 | x4 â xA | x5 â xB | x6 â xC | x7 â xD + | x8 â xE | x9 â xF | xA â x0 | xB â x1 | xC â x2 | xD â x3 | xE â x4 | xF â x5 ] + | x6 â match e2 with + [ x0 â x7 | x1 â x8 | x2 â x9 | x3 â xA | x4 â xB | x5 â xC | x6 â xD | x7 â xE + | x8 â xF | x9 â x0 | xA â x1 | xB â x2 | xC â x3 | xD â x4 | xE â x5 | xF â x6 ] + | x7 â match e2 with + [ x0 â x8 | x1 â x9 | x2 â xA | x3 â xB | x4 â xC | x5 â xD | x6 â xE | x7 â xF + | x8 â x0 | x9 â x1 | xA â x2 | xB â x3 | xC â x4 | xD â x5 | xE â x6 | xF â x7 ] + | x8 â match e2 with + [ x0 â x9 | x1 â xA | x2 â xB | x3 â xC | x4 â xD | x5 â xE | x6 â xF | x7 â x0 + | x8 â x1 | x9 â x2 | xA â x3 | xB â x4 | xC â x5 | xD â x6 | xE â x7 | xF â x8 ] + | x9 â match e2 with + [ x0 â xA | x1 â xB | x2 â xC | x3 â xD | x4 â xE | x5 â xF | x6 â x0 | x7 â x1 + | x8 â x2 | x9 â x3 | xA â x4 | xB â x5 | xC â x6 | xD â x7 | xE â x8 | xF â x9 ] + | xA â match e2 with + [ x0 â xB | x1 â xC | x2 â xD | x3 â xE | x4 â xF | x5 â x0 | x6 â x1 | x7 â x2 + | x8 â x3 | x9 â x4 | xA â x5 | xB â x6 | xC â x7 | xD â x8 | xE â x9 | xF â xA ] + | xB â match e2 with + [ x0 â xC | x1 â xD | x2 â xE | x3 â xF | x4 â x0 | x5 â x1 | x6 â x2 | x7 â x3 + | x8 â x4 | x9 â x5 | xA â x6 | xB â x7 | xC â x8 | xD â x9 | xE â xA | xF â xB ] + | xC â match e2 with + [ x0 â xD | x1 â xE | x2 â xF | x3 â x0 | x4 â x1 | x5 â x2 | x6 â x3 | x7 â x4 + | x8 â x5 | x9 â x6 | xA â x7 | xB â x8 | xC â x9 | xD â xA | xE â xB | xF â xC ] + | xD â match e2 with + [ x0 â xE | x1 â xF | x2 â x0 | x3 â x1 | x4 â x2 | x5 â x3 | x6 â x4 | x7 â x5 + | x8 â x6 | x9 â x7 | xA â x8 | xB â x9 | xC â xA | xD â xB | xE â xC | xF â xD ] + | xE â match e2 with + [ x0 â xF | x1 â x0 | x2 â x1 | x3 â x2 | x4 â x3 | x5 â x4 | x6 â x5 | x7 â x6 + | x8 â x7 | x9 â x8 | xA â x9 | xB â xA | xC â xB | xD â xC | xE â xD | xF â xE ] + | xF â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x8 | x9 â x9 | xA â xA | xB â xB | xC â xC | xD â xD | xE â xE | xF â xF ] + ] + | false â match e1 with + [ x0 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x8 | x9 â x9 | xA â xA | xB â xB | xC â xC | xD â xD | xE â xE | xF â xF ] + | x1 â match e2 with + [ x0 â x1 | x1 â x2 | x2 â x3 | x3 â x4 | x4 â x5 | x5 â x6 | x6 â x7 | x7 â x8 + | x8 â x9 | x9 â xA | xA â xB | xB â xC | xC â xD | xD â xE | xE â xF | xF â x0 ] + | x2 â match e2 with + [ x0 â x2 | x1 â x3 | x2 â x4 | x3 â x5 | x4 â x6 | x5 â x7 | x6 â x8 | x7 â x9 + | x8 â xA | x9 â xB | xA â xC | xB â xD | xC â xE | xD â xF | xE â x0 | xF â x1 ] + | x3 â match e2 with + [ x0 â x3 | x1 â x4 | x2 â x5 | x3 â x6 | x4 â x7 | x5 â x8 | x6 â x9 | x7 â xA + | x8 â xB | x9 â xC | xA â xD | xB â xE | xC â xF | xD â x0 | xE â x1 | xF â x2 ] + | x4 â match e2 with + [ x0 â x4 | x1 â x5 | x2 â x6 | x3 â x7 | x4 â x8 | x5 â x9 | x6 â xA | x7 â xB + | x8 â xC | x9 â xD | xA â xE | xB â xF | xC â x0 | xD â x1 | xE â x2 | xF â x3 ] + | x5 â match e2 with + [ x0 â x5 | x1 â x6 | x2 â x7 | x3 â x8 | x4 â x9 | x5 â xA | x6 â xB | x7 â xC + | x8 â xD | x9 â xE | xA â xF | xB â x0 | xC â x1 | xD â x2 | xE â x3 | xF â x4 ] + | x6 â match e2 with + [ x0 â x6 | x1 â x7 | x2 â x8 | x3 â x9 | x4 â xA | x5 â xB | x6 â xC | x7 â xD + | x8 â xE | x9 â xF | xA â x0 | xB â x1 | xC â x2 | xD â x3 | xE â x4 | xF â x5 ] + | x7 â match e2 with + [ x0 â x7 | x1 â x8 | x2 â x9 | x3 â xA | x4 â xB | x5 â xC | x6 â xD | x7 â xE + | x8 â xF | x9 â x0 | xA â x1 | xB â x2 | xC â x3 | xD â x4 | xE â x5 | xF â x6 ] + | x8 â match e2 with + [ x0 â x8 | x1 â x9 | x2 â xA | x3 â xB | x4 â xC | x5 â xD | x6 â xE | x7 â xF + | x8 â x0 | x9 â x1 | xA â x2 | xB â x3 | xC â x4 | xD â x5 | xE â x6 | xF â x7 ] + | x9 â match e2 with + [ x0 â x9 | x1 â xA | x2 â xB | x3 â xC | x4 â xD | x5 â xE | x6 â xF | x7 â x0 + | x8 â x1 | x9 â x2 | xA â x3 | xB â x4 | xC â x5 | xD â x6 | xE â x7 | xF â x8 ] + | xA â match e2 with + [ x0 â xA | x1 â xB | x2 â xC | x3 â xD | x4 â xE | x5 â xF | x6 â x0 | x7 â x1 + | x8 â x2 | x9 â x3 | xA â x4 | xB â x5 | xC â x6 | xD â x7 | xE â x8 | xF â x9 ] + | xB â match e2 with + [ x0 â xB | x1 â xC | x2 â xD | x3 â xE | x4 â xF | x5 â x0 | x6 â x1 | x7 â x2 + | x8 â x3 | x9 â x4 | xA â x5 | xB â x6 | xC â x7 | xD â x8 | xE â x9 | xF â xA ] + | xC â match e2 with + [ x0 â xC | x1 â xD | x2 â xE | x3 â xF | x4 â x0 | x5 â x1 | x6 â x2 | x7 â x3 + | x8 â x4 | x9 â x5 | xA â x6 | xB â x7 | xC â x8 | xD â x9 | xE â xA | xF â xB ] + | xD â match e2 with + [ x0 â xD | x1 â xE | x2 â xF | x3 â x0 | x4 â x1 | x5 â x2 | x6 â x3 | x7 â x4 + | x8 â x5 | x9 â x6 | xA â x7 | xB â x8 | xC â x9 | xD â xA | xE â xB | xF â xC ] + | xE â match e2 with + [ x0 â xE | x1 â xF | x2 â x0 | x3 â x1 | x4 â x2 | x5 â x3 | x6 â x4 | x7 â x5 + | x8 â x6 | x9 â x7 | xA â x8 | xB â x9 | xC â xA | xD â xB | xE â xC | xF â xD ] + | xF â match e2 with + [ x0 â xF | x1 â x0 | x2 â x1 | x3 â x2 | x4 â x3 | x5 â x4 | x6 â x5 | x7 â x6 + | x8 â x7 | x9 â x8 | xA â x9 | xB â xA | xC â xB | xD â xC | xE â xD | xF â xE ] + ]]. + +(* operatore somma con data â data *) +ndefinition plus_ex_d_d â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with + [ x0 â x0 | x1 â x1 | x2 â x2 | x3 â x3 | x4 â x4 | x5 â x5 | x6 â x6 | x7 â x7 + | x8 â x8 | x9 â x9 | xA â xA | xB â xB | xC â xC | xD â xD | xE â xE | xF â xF ] + | x1 â match e2 with + [ x0 â x1 | x1 â x2 | x2 â x3 | x3 â x4 | x4 â x5 | x5 â x6 | x6 â x7 | x7 â x8 + | x8 â x9 | x9 â xA | xA â xB | xB â xC | xC â xD | xD â xE | xE â xF | xF â x0 ] + | x2 â match e2 with + [ x0 â x2 | x1 â x3 | x2 â x4 | x3 â x5 | x4 â x6 | x5 â x7 | x6 â x8 | x7 â x9 + | x8 â xA | x9 â xB | xA â xC | xB â xD | xC â xE | xD â xF | xE â x0 | xF â x1 ] + | x3 â match e2 with + [ x0 â x3 | x1 â x4 | x2 â x5 | x3 â x6 | x4 â x7 | x5 â x8 | x6 â x9 | x7 â xA + | x8 â xB | x9 â xC | xA â xD | xB â xE | xC â xF | xD â x0 | xE â x1 | xF â x2 ] + | x4 â match e2 with + [ x0 â x4 | x1 â x5 | x2 â x6 | x3 â x7 | x4 â x8 | x5 â x9 | x6 â xA | x7 â xB + | x8 â xC | x9 â xD | xA â xE | xB â xF | xC â x0 | xD â x1 | xE â x2 | xF â x3 ] + | x5 â match e2 with + [ x0 â x5 | x1 â x6 | x2 â x7 | x3 â x8 | x4 â x9 | x5 â xA | x6 â xB | x7 â xC + | x8 â xD | x9 â xE | xA â xF | xB â x0 | xC â x1 | xD â x2 | xE â x3 | xF â x4 ] + | x6 â match e2 with + [ x0 â x6 | x1 â x7 | x2 â x8 | x3 â x9 | x4 â xA | x5 â xB | x6 â xC | x7 â xD + | x8 â xE | x9 â xF | xA â x0 | xB â x1 | xC â x2 | xD â x3 | xE â x4 | xF â x5 ] + | x7 â match e2 with + [ x0 â x7 | x1 â x8 | x2 â x9 | x3 â xA | x4 â xB | x5 â xC | x6 â xD | x7 â xE + | x8 â xF | x9 â x0 | xA â x1 | xB â x2 | xC â x3 | xD â x4 | xE â x5 | xF â x6 ] + | x8 â match e2 with + [ x0 â x8 | x1 â x9 | x2 â xA | x3 â xB | x4 â xC | x5 â xD | x6 â xE | x7 â xF + | x8 â x0 | x9 â x1 | xA â x2 | xB â x3 | xC â x4 | xD â x5 | xE â x6 | xF â x7 ] + | x9 â match e2 with + [ x0 â x9 | x1 â xA | x2 â xB | x3 â xC | x4 â xD | x5 â xE | x6 â xF | x7 â x0 + | x8 â x1 | x9 â x2 | xA â x3 | xB â x4 | xC â x5 | xD â x6 | xE â x7 | xF â x8 ] + | xA â match e2 with + [ x0 â xA | x1 â xB | x2 â xC | x3 â xD | x4 â xE | x5 â xF | x6 â x0 | x7 â x1 + | x8 â x2 | x9 â x3 | xA â x4 | xB â x5 | xC â x6 | xD â x7 | xE â x8 | xF â x9 ] + | xB â match e2 with + [ x0 â xB | x1 â xC | x2 â xD | x3 â xE | x4 â xF | x5 â x0 | x6 â x1 | x7 â x2 + | x8 â x3 | x9 â x4 | xA â x5 | xB â x6 | xC â x7 | xD â x8 | xE â x9 | xF â xA ] + | xC â match e2 with + [ x0 â xC | x1 â xD | x2 â xE | x3 â xF | x4 â x0 | x5 â x1 | x6 â x2 | x7 â x3 + | x8 â x4 | x9 â x5 | xA â x6 | xB â x7 | xC â x8 | xD â x9 | xE â xA | xF â xB ] + | xD â match e2 with + [ x0 â xD | x1 â xE | x2 â xF | x3 â x0 | x4 â x1 | x5 â x2 | x6 â x3 | x7 â x4 + | x8 â x5 | x9 â x6 | xA â x7 | xB â x8 | xC â x9 | xD â xA | xE â xB | xF â xC ] + | xE â match e2 with + [ x0 â xE | x1 â xF | x2 â x0 | x3 â x1 | x4 â x2 | x5 â x3 | x6 â x4 | x7 â x5 + | x8 â x6 | x9 â x7 | xA â x8 | xB â x9 | xC â xA | xD â xB | xE â xC | xF â xD ] + | xF â match e2 with + [ x0 â xF | x1 â x0 | x2 â x1 | x3 â x2 | x4 â x3 | x5 â x4 | x6 â x5 | x7 â x6 + | x8 â x7 | x9 â x8 | xA â x9 | xB â xA | xC â xB | xD â xC | xE â xD | xF â xE ] + ]. + +(* operatore somma con data+carry â carry *) +ndefinition plus_ex_dc_c â +λc:bool.λe1,e2:exadecim. + match c with + [ true â match e1 with + [ x0 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â false | xF â true ] + | x1 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â true | xF â true ] + | x2 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â true | xE â true | xF â true ] + | x3 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â true | xD â true | xE â true | xF â true ] + | x4 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x5 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x6 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x7 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x8 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x9 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xA â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xB â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xC â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xD â match e2 with + [ x0 â false | x1 â false | x2 â true | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xE â match e2 with + [ x0 â false | x1 â true | x2 â true | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xF â match e2 with + [ x0 â true | x1 â true | x2 â true | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + ] + | false â match e1 with + [ x0 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â false | xF â false ] + | x1 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â false | xF â true ] + | x2 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â true | xF â true ] + | x3 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â true | xE â true | xF â true ] + | x4 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â true | xD â true | xE â true | xF â true ] + | x5 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x6 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x7 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x8 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x9 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xA â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xB â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xC â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xD â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xE â match e2 with + [ x0 â false | x1 â false | x2 â true | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xF â match e2 with + [ x0 â false | x1 â true | x2 â true | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + ]]. + +(* operatore somma con data â carry *) +ndefinition plus_ex_d_c â +λe1,e2:exadecim. + match e1 with + [ x0 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â false | xF â false ] + | x1 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â false | xF â true ] + | x2 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â false | xE â true | xF â true ] + | x3 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â false | xD â true | xE â true | xF â true ] + | x4 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â false | xC â true | xD â true | xE â true | xF â true ] + | x5 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â false | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x6 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â false | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x7 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â false | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x8 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â false + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | x9 â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â false | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xA â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â false | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xB â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â false | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xC â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â false | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xD â match e2 with + [ x0 â false | x1 â false | x2 â false | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xE â match e2 with + [ x0 â false | x1 â false | x2 â true | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + | xF â match e2 with + [ x0 â false | x1 â true | x2 â true | x3 â true | x4 â true | x5 â true | x6 â true | x7 â true + | x8 â true | x9 â true | xA â true | xB â true | xC â true | xD â true | xE â true | xF â true ] + ]. + +(* operatore predecessore *) +ndefinition pred_ex â +λe:exadecim. + match e with + [ x0 â xF | x1 â x0 | x2 â x1 | x3 â x2 + | x4 â x3 | x5 â x4 | x6 â x5 | x7 â x6 + | x8 â x7 | x9 â x8 | xA â x9 | xB â xA + | xC â xB | xD â xC | xE â xD | xF â xE ]. + +(* operatore successore *) +ndefinition succ_ex â +λe:exadecim. + match e with + [ x0 â x1 | x1 â x2 | x2 â x3 | x3 â x4 + | x4 â x5 | x5 â x6 | x6 â x7 | x7 â x8 + | x8 â x9 | x9 â xA | xA â xB | xB â xC + | xC â xD | xD â xE | xE â xF | xF â x0 ]. + +(* operatore neg/complemento a 2 *) +ndefinition compl_ex â +λe:exadecim.match e with + [ x0 â x0 | x1 â xF | x2 â xE | x3 â xD + | x4 â xC | x5 â xB | x6 â xA | x7 â x9 + | x8 â x8 | x9 â x7 | xA â x6 | xB â x5 + | xC â x4 | xD â x3 | xE â x2 | xF â x1 ]. + +(* operatore abs *) +ndefinition abs_ex â +λe:exadecim.match getMSB_ex e with + [ true â compl_ex e | false â e ]. + +(* operatore x in [inf,sup] o in sup],[inf *) +ndefinition inrange_ex â +λx,inf,sup:exadecim. + match le_ex inf sup with + [ true â and_bool | false â or_bool ] + (le_ex inf x) (le_ex x sup). + +(* esadecimali ricorsivi *) +ninductive rec_exadecim : exadecim â Type â + ex_O : rec_exadecim x0 +| ex_S : ân.rec_exadecim n â rec_exadecim (succ_ex n). + +(* esadecimali â esadecimali ricorsivi *) +ndefinition ex_to_recex â +λn.match n return λx.rec_exadecim x with + [ x0 â ex_O + | x1 â ex_S ? ex_O + | x2 â ex_S ? (ex_S ? ex_O) + | x3 â ex_S ? (ex_S ? (ex_S ? ex_O)) + | x4 â ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O))) + | x5 â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O)))) + | x6 â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O))))) + | x7 â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O)))))) + | x8 â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O))))))) + | x9 â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O)))))))) + | xA â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O))))))))) + | xB â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O)))))))))) + | xC â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O))))))))))) + | xD â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O)))))))))))) + | xE â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O))))))))))))) + | xF â ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? (ex_S ? ex_O)))))))))))))) + ]. + +(* ottali â esadecimali *) +ndefinition ex_of_oct â +λn.match n with + [ o0 â x0 | o1 â x1 | o2 â x2 | o3 â x3 | o4 â x4 | o5 â x5 | o6 â x6 | o7 â x7 ]. + +(* esadecimali xNNNN â ottali *) +ndefinition oct_of_exL â +λn.match n with + [ x0 â o0 | x1 â o1 | x2 â o2 | x3 â o3 | x4 â o4 | x5 â o5 | x6 â o6 | x7 â o7 + | x8 â o0 | x9 â o1 | xA â o2 | xB â o3 | xC â o4 | xD â o5 | xE â o6 | xF â o7 ]. + +(* esadecimali NNNNx â ottali *) +ndefinition oct_of_exH â +λn.match n with + [ x0 â o0 | x1 â o0 | x2 â o1 | x3 â o1 | x4 â o2 | x5 â o2 | x6 â o3 | x7 â o3 + | x8 â o4 | x9 â o4 | xA â o5 | xB â o5 | xC â o6 | xD â o6 | xE â o7 | xF â o7 ]. + +ndefinition exadecim_destruct_aux â +Î e1,e2.Î P:Prop.Î H:e1 = e2. + match eq_ex e1 e2 with [ true â P â P | false â P ]. + +ndefinition exadecim_destruct : exadecim_destruct_aux. + #e1; #e2; #P; #H; + nrewrite < H; + nelim e1; + nnormalize; + napply (λx.x). +nqed. + +nlemma eq_to_eqex : ân1,n2.n1 = n2 â eq_ex n1 n2 = true. + #n1; #n2; #H; + nrewrite > H; + nelim n2; + nnormalize; + napply refl_eq. +nqed. + +nlemma neqex_to_neq : ân1,n2.eq_ex n1 n2 = false â n1 â n2. + #n1; #n2; #H; + napply (not_to_not (n1 = n2) (eq_ex n1 n2 = true) â¦); + ##[ ##1: napply (eq_to_eqex n1 n2) + ##| ##2: napply (eqfalse_to_neqtrue ⦠H) + ##] +nqed. + +nlemma eqex_to_eq : ân1,n2.eq_ex n1 n2 = true â n1 = n2. + #n1; #n2; + ncases n1; + ncases n2; + nnormalize; + ##[ ##1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,256: #H; napply refl_eq + ##| ##*: #H; (*ndestruct lentissima...*) napply (bool_destruct ⦠H) + ##] +nqed. + +nlemma neq_to_neqex : ân1,n2.n1 â n2 â eq_ex n1 n2 = false. + #n1; #n2; #H; + napply (neqtrue_to_eqfalse (eq_ex n1 n2)); + napply (not_to_not (eq_ex n1 n2 = true) (n1 = n2) ? H); + napply (eqex_to_eq n1 n2). +nqed. + +nlemma decidable_ex : âx,y:exadecim.decidable (x = y). + #x; #y; nnormalize; + napply (or2_elim (eq_ex x y = true) (eq_ex x y = false) ? (decidable_bexpr ?)); + ##[ ##1: #H; napply (or2_intro1 (x = y) (x â y) (eqex_to_eq ⦠H)) + ##| ##2: #H; napply (or2_intro2 (x = y) (x â y) (neqex_to_neq ⦠H)) + ##] +nqed. + +nlemma symmetric_eqex : symmetricT exadecim bool eq_ex. + #n1; #n2; + napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_ex n1 n2)); + ##[ ##1: #H; nrewrite > H; napply refl_eq + ##| ##2: #H; nrewrite > (neq_to_neqex n1 n2 H); + napply (symmetric_eq ? (eq_ex n2 n1) false); + napply (neq_to_neqex n2 n1 (symmetric_neq ? n1 n2 H)) + ##] +nqed. + +nlemma exadecim_is_comparable : comparable. + @ exadecim + ##[ napply x0 + ##| napply forall_ex + ##| napply eq_ex + ##| napply eqex_to_eq + ##| napply eq_to_eqex + ##| napply neqex_to_neq + ##| napply neq_to_neqex + ##| napply decidable_ex + ##| napply symmetric_eqex + ##] +nqed. + +unification hint 0 â ⢠carr exadecim_is_comparable â¡ exadecim. + +nlemma exadecim_is_comparable_ext : comparable_ext. + napply mk_comparable_ext; + ##[ napply exadecim_is_comparable + ##| napply lt_ex + ##| napply le_ex + ##| napply gt_ex + ##| napply ge_ex + ##| napply and_ex + ##| napply or_ex + ##| napply xor_ex + ##| napply getMSB_ex + ##| napply setMSB_ex + ##| napply clrMSB_ex + ##| napply getLSB_ex + ##| napply setLSB_ex + ##| napply clrLSB_ex + ##| napply rcr_ex + ##| napply shr_ex + ##| napply ror_ex + ##| napply rcl_ex + ##| napply shl_ex + ##| napply rol_ex + ##| napply not_ex + ##| napply plus_ex_dc_dc + ##| napply plus_ex_d_dc + ##| napply plus_ex_dc_d + ##| napply plus_ex_d_d + ##| napply plus_ex_dc_c + ##| napply plus_ex_d_c + ##| napply pred_ex + ##| napply succ_ex + ##| napply compl_ex + ##| napply abs_ex + ##| napply inrange_ex + ##] +nqed. + +unification hint 0 â ⢠carr (comp_base exadecim_is_comparable_ext) â¡ exadecim. diff --git a/helm/software/matita/contribs/ng_assembly2/num/oct.ma b/helm/software/matita/contribs/ng_assembly2/num/oct.ma new file mode 100755 index 000000000..a8199dd53 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/oct.ma @@ -0,0 +1,245 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/comp.ma". +include "num/bool_lemmas.ma". + +(* ****** *) +(* OTTALI *) +(* ****** *) + +ninductive oct : Type â + o0: oct +| o1: oct +| o2: oct +| o3: oct +| o4: oct +| o5: oct +| o6: oct +| o7: oct. + +(* iteratore sugli ottali *) +ndefinition forall_oct â λP. + P o0 â P o1 â P o2 â P o3 â P o4 â P o5 â P o6 â P o7. + +(* operatore = *) +ndefinition eq_oct â +λn1,n2:oct. + match n1 with + [ o0 â match n2 with [ o0 â true | _ â false ] + | o1 â match n2 with [ o1 â true | _ â false ] + | o2 â match n2 with [ o2 â true | _ â false ] + | o3 â match n2 with [ o3 â true | _ â false ] + | o4 â match n2 with [ o4 â true | _ â false ] + | o5 â match n2 with [ o5 â true | _ â false ] + | o6 â match n2 with [ o6 â true | _ â false ] + | o7 â match n2 with [ o7 â true | _ â false ] + ]. + +(* operatore and *) +ndefinition and_oct â +λe1,e2:oct.match e1 with + [ o0 â match e2 with + [ o0 â o0 | o1 â o0 | o2 â o0 | o3 â o0 + | o4 â o0 | o5 â o0 | o6 â o0 | o7 â o0 ] + | o1 â match e2 with + [ o0 â o0 | o1 â o1 | o2 â o0 | o3 â o1 + | o4 â o0 | o5 â o1 | o6 â o0 | o7 â o1 ] + | o2 â match e2 with + [ o0 â o0 | o1 â o0 | o2 â o2 | o3 â o2 + | o4 â o0 | o5 â o0 | o6 â o2 | o7 â o2 ] + | o3 â match e2 with + [ o0 â o0 | o1 â o1 | o2 â o2 | o3 â o3 + | o4 â o0 | o5 â o1 | o6 â o2 | o7 â o3 ] + | o4 â match e2 with + [ o0 â o0 | o1 â o0 | o2 â o0 | o3 â o0 + | o4 â o4 | o5 â o4 | o6 â o4 | o7 â o4 ] + | o5 â match e2 with + [ o0 â o0 | o1 â o1 | o2 â o0 | o3 â o1 + | o4 â o4 | o5 â o5 | o6 â o4 | o7 â o5 ] + | o6 â match e2 with + [ o0 â o0 | o1 â o0 | o2 â o2 | o3 â o2 + | o4 â o4 | o5 â o4 | o6 â o6 | o7 â o6 ] + | o7 â match e2 with + [ o0 â o0 | o1 â o1 | o2 â o2 | o3 â o3 + | o4 â o4 | o5 â o5 | o6 â o6 | o7 â o7 ] + ]. + +(* operatore or *) +ndefinition or_oct â +λe1,e2:oct.match e1 with + [ o0 â match e2 with + [ o0 â o0 | o1 â o1 | o2 â o2 | o3 â o3 + | o4 â o4 | o5 â o5 | o6 â o6 | o7 â o7 ] + | o1 â match e2 with + [ o0 â o1 | o1 â o1 | o2 â o3 | o3 â o3 + | o4 â o5 | o5 â o5 | o6 â o7 | o7 â o7 ] + | o2 â match e2 with + [ o0 â o2 | o1 â o3 | o2 â o2 | o3 â o3 + | o4 â o6 | o5 â o7 | o6 â o6 | o7 â o7 ] + | o3 â match e2 with + [ o0 â o3 | o1 â o3 | o2 â o3 | o3 â o3 + | o4 â o7 | o5 â o7 | o6 â o7 | o7 â o7 ] + | o4 â match e2 with + [ o0 â o4 | o1 â o5 | o2 â o6 | o3 â o7 + | o4 â o4 | o5 â o5 | o6 â o6 | o7 â o7 ] + | o5 â match e2 with + [ o0 â o5 | o1 â o5 | o2 â o7 | o3 â o7 + | o4 â o5 | o5 â o5 | o6 â o7 | o7 â o7 ] + | o6 â match e2 with + [ o0 â o6 | o1 â o7 | o2 â o6 | o3 â o7 + | o4 â o6 | o5 â o7 | o6 â o6 | o7 â o7 ] + | o7 â match e2 with + [ o0 â o7 | o1 â o7 | o2 â o7 | o3 â o7 + | o4 â o7 | o5 â o7 | o6 â o7 | o7 â o7 ] + ]. + +(* operatore xor *) +ndefinition xor_oct â +λe1,e2:oct.match e1 with + [ o0 â match e2 with + [ o0 â o0 | o1 â o1 | o2 â o2 | o3 â o3 + | o4 â o4 | o5 â o5 | o6 â o6 | o7 â o7 ] + | o1 â match e2 with + [ o0 â o1 | o1 â o0 | o2 â o3 | o3 â o2 + | o4 â o5 | o5 â o4 | o6 â o7 | o7 â o6 ] + | o2 â match e2 with + [ o0 â o2 | o1 â o3 | o2 â o0 | o3 â o1 + | o4 â o6 | o5 â o7 | o6 â o4 | o7 â o5 ] + | o3 â match e2 with + [ o0 â o3 | o1 â o2 | o2 â o1 | o3 â o0 + | o4 â o7 | o5 â o6 | o6 â o5 | o7 â o4 ] + | o4 â match e2 with + [ o0 â o4 | o1 â o5 | o2 â o6 | o3 â o7 + | o4 â o0 | o5 â o1 | o6 â o2 | o7 â o3 ] + | o5 â match e2 with + [ o0 â o5 | o1 â o4 | o2 â o7 | o3 â o6 + | o4 â o1 | o5 â o0 | o6 â o3 | o7 â o2 ] + | o6 â match e2 with + [ o0 â o6 | o1 â o7 | o2 â o4 | o3 â o5 + | o4 â o2 | o5 â o3 | o6 â o0 | o7 â o1 ] + | o7 â match e2 with + [ o0 â o7 | o1 â o6 | o2 â o5 | o3 â o4 + | o4 â o3 | o5 â o2 | o6 â o1 | o7 â o0 ] + ]. + +(* operatore successore *) +ndefinition succ_oct â +λn.match n with + [ o0 â o1 | o1 â o2 | o2 â o3 | o3 â o4 | o4 â o5 | o5 â o6 | o6 â o7 | o7 â o0 ]. + +(* ottali ricorsivi *) +ninductive rec_oct : oct â Type â + oc_O : rec_oct o0 +| oc_S : ân.rec_oct n â rec_oct (succ_oct n). + +(* ottali â ottali ricorsivi *) +ndefinition oct_to_recoct â +λn.match n return λx.rec_oct x with + [ o0 â oc_O + | o1 â oc_S ? oc_O + | o2 â oc_S ? (oc_S ? oc_O) + | o3 â oc_S ? (oc_S ? (oc_S ? oc_O)) + | o4 â oc_S ? (oc_S ? (oc_S ? (oc_S ? oc_O))) + | o5 â oc_S ? (oc_S ? (oc_S ? (oc_S ? (oc_S ? oc_O)))) + | o6 â oc_S ? (oc_S ? (oc_S ? (oc_S ? (oc_S ? (oc_S ? oc_O))))) + | o7 â oc_S ? (oc_S ? (oc_S ? (oc_S ? (oc_S ? (oc_S ? (oc_S ? oc_O)))))) + ]. + +ndefinition oct_destruct_aux â +Î n1,n2:oct.Î P:Prop.n1 = n2 â + match eq_oct n1 n2 with [ true â P â P | false â P ]. + +ndefinition oct_destruct : oct_destruct_aux. + #n1; #n2; #P; #H; + nrewrite < H; + nelim n1; + nnormalize; + napply (λx.x). +nqed. + +nlemma eq_to_eqoct : ân1,n2.n1 = n2 â eq_oct n1 n2 = true. + #n1; #n2; #H; + nrewrite > H; + nelim n2; + nnormalize; + napply refl_eq. +nqed. + +nlemma neqoct_to_neq : ân1,n2.eq_oct n1 n2 = false â n1 â n2. + #n1; #n2; #H; + napply (not_to_not (n1 = n2) (eq_oct n1 n2 = true) â¦); + ##[ ##1: napply (eq_to_eqoct n1 n2) + ##| ##2: napply (eqfalse_to_neqtrue ⦠H) + ##] +nqed. + +nlemma eqoct_to_eq : ân1,n2.eq_oct n1 n2 = true â n1 = n2. + #n1; #n2; + ncases n1; + ncases n2; + nnormalize; + ##[ ##1,10,19,28,37,46,55,64: #H; napply refl_eq + ##| ##*: #H; ndestruct (*napply (bool_destruct ⦠H)*) + ##] +nqed. + +nlemma neq_to_neqoct : ân1,n2.n1 â n2 â eq_oct n1 n2 = false. + #n1; #n2; #H; + napply (neqtrue_to_eqfalse (eq_oct n1 n2)); + napply (not_to_not (eq_oct n1 n2 = true) (n1 = n2) ? H); + napply (eqoct_to_eq n1 n2). +nqed. + +nlemma decidable_oct : âx,y:oct.decidable (x = y). + #x; #y; nnormalize; + napply (or2_elim (eq_oct x y = true) (eq_oct x y = false) ? (decidable_bexpr ?)); + ##[ ##1: #H; napply (or2_intro1 (x = y) (x â y) (eqoct_to_eq ⦠H)) + ##| ##2: #H; napply (or2_intro2 (x = y) (x â y) (neqoct_to_neq ⦠H)) + ##] +nqed. + +nlemma symmetric_eqoct : symmetricT oct bool eq_oct. + #n1; #n2; + napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_oct n1 n2)); + ##[ ##1: #H; nrewrite > H; napply refl_eq + ##| ##2: #H; nrewrite > (neq_to_neqoct n1 n2 H); + napply (symmetric_eq ? (eq_oct n2 n1) false); + napply (neq_to_neqoct n2 n1 (symmetric_neq ? n1 n2 H)) + ##] +nqed. + +nlemma oct_is_comparable : comparable. + @ oct + ##[ napply o0 + ##| napply forall_oct + ##| napply eq_oct + ##| napply eqoct_to_eq + ##| napply eq_to_eqoct + ##| napply neqoct_to_neq + ##| napply neq_to_neqoct + ##| napply decidable_oct + ##| napply symmetric_eqoct + ##] +nqed. + +unification hint 0 â ⢠carr oct_is_comparable â¡ oct. diff --git a/helm/software/matita/contribs/ng_assembly2/num/word16.ma b/helm/software/matita/contribs/ng_assembly2/num/word16.ma new file mode 100755 index 000000000..c0d331a5a --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/word16.ma @@ -0,0 +1,616 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/byte8.ma". +include "common/nat.ma". + +(* **** *) +(* WORD *) +(* **** *) + +ndefinition word16 â comp_num byte8. +ndefinition mk_word16 â λb1,b2.mk_comp_num byte8 b1 b2. + +(* \langle \rangle *) +notation "â©x:yâª" non associative with precedence 80 + for @{ mk_comp_num byte8 $x $y }. + +ndefinition word16_is_comparable_ext â cn_is_comparable_ext byte8_is_comparable_ext. +unification hint 0 â ⢠carr (comp_base word16_is_comparable_ext) â¡ comp_num (comp_num exadecim). +unification hint 0 â ⢠carr (comp_base word16_is_comparable_ext) â¡ comp_num byte8. +unification hint 0 â ⢠carr (comp_base word16_is_comparable_ext) â¡ word16. + +(* operatore estensione unsigned *) +ndefinition extu_w16 â λb2.â©zeroc ?:b2âª. +ndefinition extu2_w16 â λe2.â©zeroc ?:â©zeroc ?,e2âªâª. + +(* operatore estensione signed *) +ndefinition exts_w16 â +λb2.â©(match getMSBc ? b2 with + [ true â predc ? (zeroc ?) | false â zeroc ? ]):b2âª. +ndefinition exts2_w16 â +λe2.(match getMSBc ? e2 with + [ true â â©predc ? (zeroc ?):â©predc ? (zeroc ?),e2âªâª + | false â â©zeroc ?:â©zeroc ?,e2âªâª ]). + +(* operatore moltiplicazione senza segno *) +(* â©a1,a2⪠* â©b1,b2⪠= (a1*b1) x0 x0 + x0 (a1*b2) x0 + x0 (a2*b1) x0 + x0 x0 (a2*b2) *) +ndefinition mulu_b8_aux â +λw:word16.nat_it ? (rolc ?) w nat4. + +ndefinition mulu_b8 â +λb1,b2:byte8. + plusc_d_d ? â©(mulu_ex (cnH ? b1) (cnH ? b2)):zeroc ?⪠+ (plusc_d_d ? (mulu_b8_aux (extu_w16 (mulu_ex (cnH ? b1) (cnL ? b2)))) + (plusc_d_d ? (mulu_b8_aux (extu_w16 (mulu_ex (cnL ? b1) (cnH ? b2)))) + (extu_w16 (mulu_ex (cnL ? b1) (cnL ? b2))))). + +(* operatore moltiplicazione con segno *) +(* x * y = sgn(x) * sgn(y) * |x| * |y| *) +ndefinition muls_b8 â +λb1,b2:byte8. +(* ++/-- â +, +-/-+ â - *) + match (getMSBc ? b1) â (getMSBc ? b2) with + (* +- -+ â - *) + [ true â complc ? + (* ++/-- â + *) + | false â λx.x ] (mulu_b8 (absc ? b1) (absc ? b2)). + +(* divisione senza segno (secondo la logica delle ALU): (quoziente resto) overflow *) +nlet rec div_b8_aux (divd:word16) (divs:word16) (molt:byte8) (q:byte8) (n:nat) on n â + let w' â plusc_d_d ? divd (complc ? divs) in + match n with + [ O â match lec ? divs divd with + [ true â triple ⦠(orc ? molt q) (cnL ? w') (â (eqc ? (cnH ? w') (zeroc ?))) + | false â triple ⦠q (cnL ? divd) (â (eqc ? (cnH ? divd) (zeroc ?))) ] + | S n' â match lec ? divs divd with + [ true â div_b8_aux w' (rorc ? divs) (rorc ? molt) (orc ? molt q) n' + | false â div_b8_aux divd (rorc ? divs) (rorc ? molt) q n' ]]. + +ndefinition div_b8 â +λw:word16.λb:byte8.match eqc ? b (zeroc ?) with +(* la combinazione n/0 e' illegale, segnala solo overflow senza dare risultato *) + [ true â triple ⦠â©xF,xF⪠(cnL ? w) true + | false â match eqc ? w (zeroc ?) with +(* 0 diviso qualsiasi cosa diverso da 0 da' q=0 r=0 o=false *) + [ true â triple ⦠(zeroc ?) (zeroc ?) false +(* 1) e' una divisione sensata che produrra' overflow/risultato *) +(* 2) parametri: dividendo, divisore, moltiplicatore, quoziente, contatore *) +(* 3) ad ogni ciclo il divisore e il moltiplicatore vengono scalati di 1 a dx *) +(* 4) il moltiplicatore e' la quantita' aggiunta al quoziente se il divisore *) +(* puo' essere sottratto al dividendo *) + | false â div_b8_aux w (nat_it ? (rolc ?) (extu_w16 b) nat7) â©x8,x0⪠(zeroc ?) nat7 ]]. + +(* word16 ricorsive *) +ninductive rec_word16 : word16 â Type â + w16_O : rec_word16 (zeroc ?) +| w16_S : ân.rec_word16 n â rec_word16 (succc ? n). + +(* word16 â word16 ricorsive *) + +(* EX: ancora problema di tempi ??? +ndefinition w16_to_recw16_aux1_1 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x1,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? ( + w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? (w16_S ? recw + ))))))))))))))). +*) + +ndefinition w16_to_recw16_aux1_1 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x1,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x0,xFâªâª (w16_S â©n:â©x0,xEâªâª (w16_S â©n:â©x0,xDâªâª (w16_S â©n:â©x0,xCâªâª ( + w16_S â©n:â©x0,xBâªâª (w16_S â©n:â©x0,xAâªâª (w16_S â©n:â©x0,x9âªâª (w16_S â©n:â©x0,x8âªâª ( + w16_S â©n:â©x0,x7âªâª (w16_S â©n:â©x0,x6âªâª (w16_S â©n:â©x0,x5âªâª (w16_S â©n:â©x0,x4âªâª ( + w16_S â©n:â©x0,x3âªâª (w16_S â©n:â©x0,x2âªâª (w16_S â©n:â©x0,x1âªâª (w16_S â©n:â©x0,x0âªâª recw + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_2 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x2,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x1,xFâªâª (w16_S â©n:â©x1,xEâªâª (w16_S â©n:â©x1,xDâªâª (w16_S â©n:â©x1,xCâªâª ( + w16_S â©n:â©x1,xBâªâª (w16_S â©n:â©x1,xAâªâª (w16_S â©n:â©x1,x9âªâª (w16_S â©n:â©x1,x8âªâª ( + w16_S â©n:â©x1,x7âªâª (w16_S â©n:â©x1,x6âªâª (w16_S â©n:â©x1,x5âªâª (w16_S â©n:â©x1,x4âªâª ( + w16_S â©n:â©x1,x3âªâª (w16_S â©n:â©x1,x2âªâª (w16_S â©n:â©x1,x1âªâª (w16_S â©n:â©x1,x0âªâª (w16_to_recw16_aux1_1 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_3 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x3,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x2,xFâªâª (w16_S â©n:â©x2,xEâªâª (w16_S â©n:â©x2,xDâªâª (w16_S â©n:â©x2,xCâªâª ( + w16_S â©n:â©x2,xBâªâª (w16_S â©n:â©x2,xAâªâª (w16_S â©n:â©x2,x9âªâª (w16_S â©n:â©x2,x8âªâª ( + w16_S â©n:â©x2,x7âªâª (w16_S â©n:â©x2,x6âªâª (w16_S â©n:â©x2,x5âªâª (w16_S â©n:â©x2,x4âªâª ( + w16_S â©n:â©x2,x3âªâª (w16_S â©n:â©x2,x2âªâª (w16_S â©n:â©x2,x1âªâª (w16_S â©n:â©x2,x0âªâª (w16_to_recw16_aux1_2 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_4 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x4,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x3,xFâªâª (w16_S â©n:â©x3,xEâªâª (w16_S â©n:â©x3,xDâªâª (w16_S â©n:â©x3,xCâªâª ( + w16_S â©n:â©x3,xBâªâª (w16_S â©n:â©x3,xAâªâª (w16_S â©n:â©x3,x9âªâª (w16_S â©n:â©x3,x8âªâª ( + w16_S â©n:â©x3,x7âªâª (w16_S â©n:â©x3,x6âªâª (w16_S â©n:â©x3,x5âªâª (w16_S â©n:â©x3,x4âªâª ( + w16_S â©n:â©x3,x3âªâª (w16_S â©n:â©x3,x2âªâª (w16_S â©n:â©x3,x1âªâª (w16_S â©n:â©x3,x0âªâª (w16_to_recw16_aux1_3 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_5 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x5,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x4,xFâªâª (w16_S â©n:â©x4,xEâªâª (w16_S â©n:â©x4,xDâªâª (w16_S â©n:â©x4,xCâªâª ( + w16_S â©n:â©x4,xBâªâª (w16_S â©n:â©x4,xAâªâª (w16_S â©n:â©x4,x9âªâª (w16_S â©n:â©x4,x8âªâª ( + w16_S â©n:â©x4,x7âªâª (w16_S â©n:â©x4,x6âªâª (w16_S â©n:â©x4,x5âªâª (w16_S â©n:â©x4,x4âªâª ( + w16_S â©n:â©x4,x3âªâª (w16_S â©n:â©x4,x2âªâª (w16_S â©n:â©x4,x1âªâª (w16_S â©n:â©x4,x0âªâª (w16_to_recw16_aux1_4 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_6 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x6,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x5,xFâªâª (w16_S â©n:â©x5,xEâªâª (w16_S â©n:â©x5,xDâªâª (w16_S â©n:â©x5,xCâªâª ( + w16_S â©n:â©x5,xBâªâª (w16_S â©n:â©x5,xAâªâª (w16_S â©n:â©x5,x9âªâª (w16_S â©n:â©x5,x8âªâª ( + w16_S â©n:â©x5,x7âªâª (w16_S â©n:â©x5,x6âªâª (w16_S â©n:â©x5,x5âªâª (w16_S â©n:â©x5,x4âªâª ( + w16_S â©n:â©x5,x3âªâª (w16_S â©n:â©x5,x2âªâª (w16_S â©n:â©x5,x1âªâª (w16_S â©n:â©x5,x0âªâª (w16_to_recw16_aux1_5 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_7 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x7,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x6,xFâªâª (w16_S â©n:â©x6,xEâªâª (w16_S â©n:â©x6,xDâªâª (w16_S â©n:â©x6,xCâªâª ( + w16_S â©n:â©x6,xBâªâª (w16_S â©n:â©x6,xAâªâª (w16_S â©n:â©x6,x9âªâª (w16_S â©n:â©x6,x8âªâª ( + w16_S â©n:â©x6,x7âªâª (w16_S â©n:â©x6,x6âªâª (w16_S â©n:â©x6,x5âªâª (w16_S â©n:â©x6,x4âªâª ( + w16_S â©n:â©x6,x3âªâª (w16_S â©n:â©x6,x2âªâª (w16_S â©n:â©x6,x1âªâª (w16_S â©n:â©x6,x0âªâª (w16_to_recw16_aux1_6 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_8 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x8,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x7,xFâªâª (w16_S â©n:â©x7,xEâªâª (w16_S â©n:â©x7,xDâªâª (w16_S â©n:â©x7,xCâªâª ( + w16_S â©n:â©x7,xBâªâª (w16_S â©n:â©x7,xAâªâª (w16_S â©n:â©x7,x9âªâª (w16_S â©n:â©x7,x8âªâª ( + w16_S â©n:â©x7,x7âªâª (w16_S â©n:â©x7,x6âªâª (w16_S â©n:â©x7,x5âªâª (w16_S â©n:â©x7,x4âªâª ( + w16_S â©n:â©x7,x3âªâª (w16_S â©n:â©x7,x2âªâª (w16_S â©n:â©x7,x1âªâª (w16_S â©n:â©x7,x0âªâª (w16_to_recw16_aux1_7 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_9 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©x9,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x8,xFâªâª (w16_S â©n:â©x8,xEâªâª (w16_S â©n:â©x8,xDâªâª (w16_S â©n:â©x8,xCâªâª ( + w16_S â©n:â©x8,xBâªâª (w16_S â©n:â©x8,xAâªâª (w16_S â©n:â©x8,x9âªâª (w16_S â©n:â©x8,x8âªâª ( + w16_S â©n:â©x8,x7âªâª (w16_S â©n:â©x8,x6âªâª (w16_S â©n:â©x8,x5âªâª (w16_S â©n:â©x8,x4âªâª ( + w16_S â©n:â©x8,x3âªâª (w16_S â©n:â©x8,x2âªâª (w16_S â©n:â©x8,x1âªâª (w16_S â©n:â©x8,x0âªâª (w16_to_recw16_aux1_8 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_10 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©xA,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©x9,xFâªâª (w16_S â©n:â©x9,xEâªâª (w16_S â©n:â©x9,xDâªâª (w16_S â©n:â©x9,xCâªâª ( + w16_S â©n:â©x9,xBâªâª (w16_S â©n:â©x9,xAâªâª (w16_S â©n:â©x9,x9âªâª (w16_S â©n:â©x9,x8âªâª ( + w16_S â©n:â©x9,x7âªâª (w16_S â©n:â©x9,x6âªâª (w16_S â©n:â©x9,x5âªâª (w16_S â©n:â©x9,x4âªâª ( + w16_S â©n:â©x9,x3âªâª (w16_S â©n:â©x9,x2âªâª (w16_S â©n:â©x9,x1âªâª (w16_S â©n:â©x9,x0âªâª (w16_to_recw16_aux1_9 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_11 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©xB,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©xA,xFâªâª (w16_S â©n:â©xA,xEâªâª (w16_S â©n:â©xA,xDâªâª (w16_S â©n:â©xA,xCâªâª ( + w16_S â©n:â©xA,xBâªâª (w16_S â©n:â©xA,xAâªâª (w16_S â©n:â©xA,x9âªâª (w16_S â©n:â©xA,x8âªâª ( + w16_S â©n:â©xA,x7âªâª (w16_S â©n:â©xA,x6âªâª (w16_S â©n:â©xA,x5âªâª (w16_S â©n:â©xA,x4âªâª ( + w16_S â©n:â©xA,x3âªâª (w16_S â©n:â©xA,x2âªâª (w16_S â©n:â©xA,x1âªâª (w16_S â©n:â©xA,x0âªâª (w16_to_recw16_aux1_10 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_12 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©xC,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©xB,xFâªâª (w16_S â©n:â©xB,xEâªâª (w16_S â©n:â©xB,xDâªâª (w16_S â©n:â©xB,xCâªâª ( + w16_S â©n:â©xB,xBâªâª (w16_S â©n:â©xB,xAâªâª (w16_S â©n:â©xB,x9âªâª (w16_S â©n:â©xB,x8âªâª ( + w16_S â©n:â©xB,x7âªâª (w16_S â©n:â©xB,x6âªâª (w16_S â©n:â©xB,x5âªâª (w16_S â©n:â©xB,x4âªâª ( + w16_S â©n:â©xB,x3âªâª (w16_S â©n:â©xB,x2âªâª (w16_S â©n:â©xB,x1âªâª (w16_S â©n:â©xB,x0âªâª (w16_to_recw16_aux1_11 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_13 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©xD,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©xC,xFâªâª (w16_S â©n:â©xC,xEâªâª (w16_S â©n:â©xC,xDâªâª (w16_S â©n:â©xC,xCâªâª ( + w16_S â©n:â©xC,xBâªâª (w16_S â©n:â©xC,xAâªâª (w16_S â©n:â©xC,x9âªâª (w16_S â©n:â©xC,x8âªâª ( + w16_S â©n:â©xC,x7âªâª (w16_S â©n:â©xC,x6âªâª (w16_S â©n:â©xC,x5âªâª (w16_S â©n:â©xC,x4âªâª ( + w16_S â©n:â©xC,x3âªâª (w16_S â©n:â©xC,x2âªâª (w16_S â©n:â©xC,x1âªâª (w16_S â©n:â©xC,x0âªâª (w16_to_recw16_aux1_12 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_14 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©xE,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©xD,xFâªâª (w16_S â©n:â©xD,xEâªâª (w16_S â©n:â©xD,xDâªâª (w16_S â©n:â©xD,xCâªâª ( + w16_S â©n:â©xD,xBâªâª (w16_S â©n:â©xD,xAâªâª (w16_S â©n:â©xD,x9âªâª (w16_S â©n:â©xD,x8âªâª ( + w16_S â©n:â©xD,x7âªâª (w16_S â©n:â©xD,x6âªâª (w16_S â©n:â©xD,x5âªâª (w16_S â©n:â©xD,x4âªâª ( + w16_S â©n:â©xD,x3âªâª (w16_S â©n:â©xD,x2âªâª (w16_S â©n:â©xD,x1âªâª (w16_S â©n:â©xD,x0âªâª (w16_to_recw16_aux1_13 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1_15 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©n:â©xF,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©xE,xFâªâª (w16_S â©n:â©xE,xEâªâª (w16_S â©n:â©xE,xDâªâª (w16_S â©n:â©xE,xCâªâª ( + w16_S â©n:â©xE,xBâªâª (w16_S â©n:â©xE,xAâªâª (w16_S â©n:â©xE,x9âªâª (w16_S â©n:â©xE,x8âªâª ( + w16_S â©n:â©xE,x7âªâª (w16_S â©n:â©xE,x6âªâª (w16_S â©n:â©xE,x5âªâª (w16_S â©n:â©xE,x4âªâª ( + w16_S â©n:â©xE,x3âªâª (w16_S â©n:â©xE,x2âªâª (w16_S â©n:â©xE,x1âªâª (w16_S â©n:â©xE,x0âªâª (w16_to_recw16_aux1_14 ? recw) + ))))))))))))))). + +ndefinition w16_to_recw16_aux1 : Î n.rec_word16 â©n:â©x0,x0âªâª â rec_word16 â©(succc ? n):â©x0,x0âªâª â +λn.λrecw:rec_word16 â©n:â©x0,x0âªâª. + w16_S â©n:â©xF,xFâªâª (w16_S â©n:â©xF,xEâªâª (w16_S â©n:â©xF,xDâªâª (w16_S â©n:â©xF,xCâªâª ( + w16_S â©n:â©xF,xBâªâª (w16_S â©n:â©xF,xAâªâª (w16_S â©n:â©xF,x9âªâª (w16_S â©n:â©xF,x8âªâª ( + w16_S â©n:â©xF,x7âªâª (w16_S â©n:â©xF,x6âªâª (w16_S â©n:â©xF,x5âªâª (w16_S â©n:â©xF,x4âªâª ( + w16_S â©n:â©xF,x3âªâª (w16_S â©n:â©xF,x2âªâª (w16_S â©n:â©xF,x1âªâª (w16_S â©n:â©xF,x0âªâª (w16_to_recw16_aux1_15 ? recw) + ))))))))))))))). + +(* ... cifra byte superiore *) +nlet rec w16_to_recw16_aux2 (n:byte8) (r:rec_byte8 n) on r â + match r return λx.λy:rec_byte8 x.rec_word16 â©x:â©x0,x0âªâª with + [ b8_O â w16_O + | b8_S t n' â w16_to_recw16_aux1 ? (w16_to_recw16_aux2 t n') + ]. + +(* ... cifra esadecimale n.2 *) +ndefinition w16_to_recw16_aux3 â +λb,n.λrecw:rec_word16 â©b:â©x0,x0âªâª. + match n return λx.rec_word16 â©b:â©x,x0âªâª with + [ x0 â recw + | x1 â w16_to_recw16_aux1_1 ? recw + | x2 â w16_to_recw16_aux1_2 ? recw + | x3 â w16_to_recw16_aux1_3 ? recw + | x4 â w16_to_recw16_aux1_4 ? recw + | x5 â w16_to_recw16_aux1_5 ? recw + | x6 â w16_to_recw16_aux1_6 ? recw + | x7 â w16_to_recw16_aux1_7 ? recw + | x8 â w16_to_recw16_aux1_8 ? recw + | x9 â w16_to_recw16_aux1_9 ? recw + | xA â w16_to_recw16_aux1_10 ? recw + | xB â w16_to_recw16_aux1_11 ? recw + | xC â w16_to_recw16_aux1_12 ? recw + | xD â w16_to_recw16_aux1_13 ? recw + | xE â w16_to_recw16_aux1_14 ? recw + | xF â w16_to_recw16_aux1_15 ? recw + ]. + +ndefinition w16_to_recw16_aux4_1 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x1âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x1âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? recw + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? recw + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? recw + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? recw + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? recw + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? recw + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? recw + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? recw + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? recw + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? recw + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? recw + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? recw + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? recw + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? recw + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? recw + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? recw + ]. + +ndefinition w16_to_recw16_aux4_2 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x2âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x2âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_1 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_3 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x3âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x3âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_2 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_4 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x4âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x4âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_3 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_5 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x5âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x5âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_4 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_6 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x6âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x6âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_5 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_7 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x7âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x7âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_6 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_8 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x8âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x8âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_7 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_9 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,x9âªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,x9âªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_8 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_10 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,xAâªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,xAâªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_9 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_11 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,xBâªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,xBâªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_10 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_12 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,xCâªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,xCâªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_11 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_13 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,xDâªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,xDâªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_12 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_14 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,xEâªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,xEâªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_13 ⦠recw) + ]. + +ndefinition w16_to_recw16_aux4_15 : Î n,e.rec_word16 â©n:â©e,x0âªâª â rec_word16 â©n:â©e,xFâªâª â +λn,e. + match e return λx.rec_word16 â©n:â©x,x0âªâª â rec_word16 â©n:â©x,xFâªâª with + [ x0 â λrecw:rec_word16 â©n:â©x0,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x1 â λrecw:rec_word16 â©n:â©x1,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x2 â λrecw:rec_word16 â©n:â©x2,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x3 â λrecw:rec_word16 â©n:â©x3,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x4 â λrecw:rec_word16 â©n:â©x4,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x5 â λrecw:rec_word16 â©n:â©x5,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x6 â λrecw:rec_word16 â©n:â©x6,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x7 â λrecw:rec_word16 â©n:â©x7,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x8 â λrecw:rec_word16 â©n:â©x8,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | x9 â λrecw:rec_word16 â©n:â©x9,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | xA â λrecw:rec_word16 â©n:â©xA,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | xB â λrecw:rec_word16 â©n:â©xB,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | xC â λrecw:rec_word16 â©n:â©xC,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | xD â λrecw:rec_word16 â©n:â©xD,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | xE â λrecw:rec_word16 â©n:â©xE,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + | xF â λrecw:rec_word16 â©n:â©xF,x0âªâª.w16_S ? (w16_to_recw16_aux4_14 ⦠recw) + ]. + +(* ... cifra esadecimale n.1 *) +ndefinition w16_to_recw16_aux4 â +λb,e,n.λrecw:rec_word16 â©b:â©e,x0âªâª. + match n return λx.rec_word16 â©b:â©e,xâªâª with + [ x0 â recw + | x1 â w16_to_recw16_aux4_1 ⦠recw + | x2 â w16_to_recw16_aux4_2 ⦠recw + | x3 â w16_to_recw16_aux4_3 ⦠recw + | x4 â w16_to_recw16_aux4_4 ⦠recw + | x5 â w16_to_recw16_aux4_5 ⦠recw + | x6 â w16_to_recw16_aux4_6 ⦠recw + | x7 â w16_to_recw16_aux4_7 ⦠recw + | x8 â w16_to_recw16_aux4_8 ⦠recw + | x9 â w16_to_recw16_aux4_9 ⦠recw + | xA â w16_to_recw16_aux4_10 ⦠recw + | xB â w16_to_recw16_aux4_11 ⦠recw + | xC â w16_to_recw16_aux4_12 ⦠recw + | xD â w16_to_recw16_aux4_13 ⦠recw + | xE â w16_to_recw16_aux4_14 ⦠recw + | xF â w16_to_recw16_aux4_15 ⦠recw + ]. + +ndefinition w16_to_recw16 : Î w.rec_word16 w â +λw. + match w with [ mk_comp_num h l â + match l with [ mk_comp_num lh ll â + w16_to_recw16_aux4 h lh ll (w16_to_recw16_aux3 h lh (w16_to_recw16_aux2 h (b8_to_recb8 h))) ]]. diff --git a/helm/software/matita/contribs/ng_assembly2/num/word24.ma b/helm/software/matita/contribs/ng_assembly2/num/word24.ma new file mode 100755 index 000000000..f523e996e --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/word24.ma @@ -0,0 +1,218 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/byte8.ma". + +(* ********* *) +(* BYTE+WORD *) +(* ********* *) + +nrecord word24 : Type â + { + w24x: byte8; + w24h: byte8; + w24l: byte8 + }. + +(* \langle \rangle *) +notation "â©x;y;zâª" non associative with precedence 80 + for @{ 'mk_word24 $x $y $z }. +interpretation "mk_word24" 'mk_word24 x y z = (mk_word24 x y z). + +(* operatore = *) +ndefinition eq_w24 â +λw1,w2.(eqc ? (w24x w1) (w24x w2)) â + (eqc ? (w24h w1) (w24h w2)) â + (eqc ? (w24l w1) (w24l w2)). + +nlemma word24_destruct_1 : +âx1,x2,y1,y2,z1,z2. + mk_word24 x1 y1 z1 = mk_word24 x2 y2 z2 â x1 = x2. + #x1; #x2; #y1; #y2; #z1; #z2; #H; + nchange with (match mk_word24 x2 y2 z2 with [ mk_word24 a _ _ â x1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma word24_destruct_2 : +âx1,x2,y1,y2,z1,z2. + mk_word24 x1 y1 z1 = mk_word24 x2 y2 z2 â y1 = y2. + #x1; #x2; #y1; #y2; #z1; #z2; #H; + nchange with (match mk_word24 x2 y2 z2 with [ mk_word24 _ a _ â y1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma word24_destruct_3 : +âx1,x2,y1,y2,z1,z2. + mk_word24 x1 y1 z1 = mk_word24 x2 y2 z2 â z1 = z2. + #x1; #x2; #y1; #y2; #z1; #z2; #H; + nchange with (match mk_word24 x2 y2 z2 with [ mk_word24 _ _ a â z1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +nlemma symmetric_eqw24 : symmetricT word24 bool eq_w24. + #b1; nelim b1; #e1; #e2; #e3; + #b2; nelim b2; #e4; #e5; #e6; + nchange with (((eqc ? e1 e4)â(eqc ? e2 e5)â(eqc ? e3 e6)) = ((eqc ? e4 e1)â(eqc ? e5 e2)â(eqc ? e6 e3))); + nrewrite > (symmetric_eqc ? e1 e4); + nrewrite > (symmetric_eqc ? e2 e5); + nrewrite > (symmetric_eqc ? e3 e6); + napply refl_eq. +nqed. + +nlemma eqw24_to_eq : âb1,b2.(eq_w24 b1 b2 = true) â (b1 = b2). + #b1; nelim b1; #e1; #e2; #e3; + #b2; nelim b2; #e4; #e5; #e6; + nchange in ⢠(% â ?) with (((eqc ? e1 e4)â(eqc ? e2 e5)â(eqc ? e3 e6)) = true); + #H; + nrewrite < (eqc_to_eq ⦠(andb_true_true_r ⦠H)); + nrewrite < (eqc_to_eq ⦠(andb_true_true_r ⦠(andb_true_true_l ⦠H))); + nrewrite < (eqc_to_eq ⦠(andb_true_true_l ⦠(andb_true_true_l ⦠H))); + napply refl_eq. +nqed. + +nlemma eq_to_eqw24 : âb1,b2.(b1 = b2) â (eq_w24 b1 b2 = true). + #b1; nelim b1; #e1; #e2; #e3; + #b2; nelim b2; #e4; #e5; #e6; + #H; + nchange with (((eqc ? e1 e4)â(eqc ? e2 e5)â(eqc ? e3 e6)) = true); + nrewrite < (word24_destruct_1 ⦠H); + nrewrite < (word24_destruct_2 ⦠H); + nrewrite < (word24_destruct_3 ⦠H); + nrewrite > (eq_to_eqc ? e1 e1 (refl_eq â¦)); + nrewrite > (eq_to_eqc ? e2 e2 (refl_eq â¦)); + nrewrite > (eq_to_eqc ? e3 e3 (refl_eq â¦)); + nnormalize; + napply refl_eq. +nqed. + +nlemma decidable_w24_aux1 : +âe1,e2,e3,e4,e5,e6.e1 â e4 â (mk_word24 e1 e2 e3) â (mk_word24 e4 e5 e6). + #e1; #e2; #e3; #e4; #e5; #e6; + nnormalize; #H; #H1; + napply (H (word24_destruct_1 ⦠H1)). +nqed. + +nlemma decidable_w24_aux2 : +âe1,e2,e3,e4,e5,e6.e2 â e5 â (mk_word24 e1 e2 e3) â (mk_word24 e4 e5 e6). + #e1; #e2; #e3; #e4; #e5; #e6; + nnormalize; #H; #H1; + napply (H (word24_destruct_2 ⦠H1)). +nqed. + +nlemma decidable_w24_aux3 : +âe1,e2,e3,e4,e5,e6.e3 â e6 â (mk_word24 e1 e2 e3) â (mk_word24 e4 e5 e6). + #e1; #e2; #e3; #e4; #e5; #e6; + nnormalize; #H; #H1; + napply (H (word24_destruct_3 ⦠H1)). +nqed. + +nlemma decidable_w24 : âb1,b2:word24.(decidable (b1 = b2)). + #b1; nelim b1; #e1; #e2; #e3; + #b2; nelim b2; #e4; #e5; #e6; + nnormalize; + napply (or2_elim (e1 = e4) (e1 â e4) ? (decidable_c ? e1 e4) â¦); + ##[ ##2: #H; napply (or2_intro2 ⦠(decidable_w24_aux1 e1 e2 e3 e4 e5 e6 H)) + ##| ##1: #H; napply (or2_elim (e2 = e5) (e2 â e5) ? (decidable_c ? e2 e5) â¦); + ##[ ##2: #H1; napply (or2_intro2 ⦠(decidable_w24_aux2 e1 e2 e3 e4 e5 e6 H1)) + ##| ##1: #H1; napply (or2_elim (e3 = e6) (e3 â e6) ? (decidable_c ? e3 e6) â¦); + ##[ ##2: #H2; napply (or2_intro2 ⦠(decidable_w24_aux3 e1 e2 e3 e4 e5 e6 H2)) + ##| ##1: #H2; nrewrite > H; nrewrite > H1; nrewrite > H2; + napply (or2_intro1 ⦠(refl_eq ? (mk_word24 e4 e5 e6))) + ##] + ##] + ##] +nqed. + +nlemma neqw24_to_neq : âb1,b2.(eq_w24 b1 b2 = false) â (b1 â b2). + #b1; nelim b1; #e1; #e2; #e3; + #b2; nelim b2; #e4; #e5; #e6; + #H; + nchange in H:(%) with (((eqc ? e1 e4)â(eqc ? e2 e5)â(eqc ? e3 e6)) = false); + #H1; + nrewrite > (word24_destruct_1 ⦠H1) in H:(%); + nrewrite > (word24_destruct_2 ⦠H1); + nrewrite > (word24_destruct_3 ⦠H1); + nrewrite > (eq_to_eqc ? e4 e4 (refl_eq â¦)); + nrewrite > (eq_to_eqc ? e5 e5 (refl_eq â¦)); + nrewrite > (eq_to_eqc ? e6 e6 (refl_eq â¦)); + #H; ndestruct. +nqed. + +nlemma word24_destruct : +âe1,e2,e3,e4,e5,e6. + ((mk_word24 e1 e2 e3) â (mk_word24 e4 e5 e6)) â + (Or3 (e1 â e4) (e2 â e5) (e3 â e6)). + #e1; #e2; #e3; #e4; #e5; #e6; + nnormalize; #H; + napply (or2_elim (e1 = e4) (e1 â e4) ? (decidable_c ? e1 e4) â¦); + ##[ ##2: #H1; napply (or3_intro1 ⦠H1) + ##| ##1: #H1; napply (or2_elim (e2 = e5) (e2 â e5) ? (decidable_c ? e2 e5) â¦); + ##[ ##2: #H2; napply (or3_intro2 ⦠H2) + ##| ##1: #H2; napply (or2_elim (e3 = e6) (e3 â e6) ? (decidable_c ? e3 e6) â¦); + ##[ ##2: #H3; napply (or3_intro3 ⦠H3) + ##| ##1: #H3; nrewrite > H1 in H:(%); + nrewrite > H2; nrewrite > H3; + #H; nelim (H (refl_eq â¦)) + ##] + ##] + ##] +nqed. + +nlemma neq_to_neqw24 : âb1,b2.((b1 â b2) â (eq_w24 b1 b2 = false)). + #b1; nelim b1; #e1; #e2; #e3; + #b2; nelim b2; #e4; #e5; #e6; + #H; nchange with (((eqc ? e1 e4)â(eqc ? e2 e5)â(eqc ? e3 e6)) = false); + napply (or3_elim (e1 â e4) (e2 â e5) (e3 â e6) ? (word24_destruct e1 e2 e3 e4 e5 e6 ⦠H) â¦); + ##[ ##1: #H1; nrewrite > (neq_to_neqc ? e1 e4 H1); nnormalize; napply refl_eq + ##| ##2: #H1; nrewrite > (neq_to_neqc ? e2 e5 H1); + nrewrite > (symmetric_andbool (eqc ? e1 e4) â¦); + nnormalize; napply refl_eq + ##| ##3: #H1; nrewrite > (neq_to_neqc ? e3 e6 H1); + nrewrite > (symmetric_andbool ((eqc ? e1 e4)â(eqc ? e2 e5)) â¦); + nnormalize; napply refl_eq + ##] +nqed. + +nlemma word24_is_comparable : comparable. + @ word24 + ##[ napply (mk_word24 (zeroc ?) (zeroc ?) (zeroc ?)) + ##| napply (λP.forallc ? + (λx.forallc ? + (λh.forallc ? + (λl.P (mk_word24 x h l))))) + ##| napply eq_w24 + ##| napply eqw24_to_eq + ##| napply eq_to_eqw24 + ##| napply neqw24_to_neq + ##| napply neq_to_neqw24 + ##| napply decidable_w24 + ##| napply symmetric_eqw24 + ##] +nqed. + +unification hint 0 â ⢠carr word24_is_comparable â¡ word24. diff --git a/helm/software/matita/contribs/ng_assembly2/num/word32.ma b/helm/software/matita/contribs/ng_assembly2/num/word32.ma new file mode 100755 index 000000000..4fbbe96fc --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/num/word32.ma @@ -0,0 +1,81 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "num/word16.ma". + +(* ***** *) +(* DWORD *) +(* ***** *) + +ndefinition word32 â comp_num word16. +ndefinition mk_word32 â λw1,w2.mk_comp_num word16 w1 w2. + +(* \langle \rangle *) +notation "â©x.yâª" non associative with precedence 80 + for @{ mk_comp_num word16 $x $y }. + +ndefinition word32_is_comparable_ext â cn_is_comparable_ext word16_is_comparable_ext. +unification hint 0 â ⢠carr (comp_base word32_is_comparable_ext) â¡ comp_num (comp_num (comp_num exadecim)). +unification hint 0 â ⢠carr (comp_base word32_is_comparable_ext) â¡ comp_num (comp_num byte8). +unification hint 0 â ⢠carr (comp_base word32_is_comparable_ext) â¡ comp_num word16. +unification hint 0 â ⢠carr (comp_base word32_is_comparable_ext) â¡ word32. + +(* operatore estensione unsigned *) +ndefinition extu_w32 â λw2.â©zeroc ?.w2âª. +ndefinition extu2_w32 â λb2.â©zeroc ?.â©zeroc ?:b2âªâª. +ndefinition extu3_w32 â λe2.â©zeroc ?.â©zeroc ?:â©zeroc ?,e2âªâªâª. + +(* operatore estensione signed *) +ndefinition exts_w32 â +λw2.â©(match getMSBc ? w2 with + [ true â predc ? (zeroc ?) | false â zeroc ? ]).w2âª. +ndefinition exts2_w32 â +λb2.(match getMSBc ? b2 with + [ true â â©predc ? (zeroc ?).â©predc ? (zeroc ?):b2âªâª + | false â â©zeroc ?.â©zeroc ?:b2âªâª ]). +ndefinition exts3_w32 â +λe2.(match getMSBc ? e2 with + [ true â â©predc ? (zeroc ?).â©predc ? (zeroc ?):â©predc ? (zeroc ?),e2âªâªâª + | false â â©zeroc ?.â©zeroc ?:â©zeroc ?,e2âªâªâª ]). + +(* operatore moltiplicazione senza segno *) +(* â©a1,a2⪠* â©b1,b2⪠= (a1*b1) x0 x0 + x0 (a1*b2) x0 + x0 (a2*b1) x0 + x0 x0 (a2*b2) *) +ndefinition mulu_w16_aux â +λw:word32.nat_it ? (rolc ?) w nat8. + +ndefinition mulu_w16 â +λw1,w2:word16. + plusc_d_d ? â©(mulu_b8 (cnH ? w1) (cnH ? w2)).zeroc ?⪠+ (plusc_d_d ? (mulu_w16_aux (extu_w32 (mulu_b8 (cnH ? w1) (cnL ? w2)))) + (plusc_d_d ? (mulu_w16_aux (extu_w32 (mulu_b8 (cnL ? w1) (cnH ? w2)))) + (extu_w32 (mulu_b8 (cnL ? w1) (cnL ? w2))))). + +(* operatore moltiplicazione con segno *) +(* x * y = sgn(x) * sgn(y) * |x| * |y| *) +ndefinition muls_w16 â +λw1,w2:word16. +(* ++/-- â +, +-/-+ â - *) + match (getMSBc ? w1) â (getMSBc ? w2) with + (* +- -+ â - *) + [ true â complc ? + (* ++/-- â + *) + | false â λx.x ] (mulu_w16 (absc ? w1) (absc ? w2)). diff --git a/helm/software/matita/contribs/ng_assembly2/root b/helm/software/matita/contribs/ng_assembly2/root new file mode 100644 index 000000000..e6f78ade0 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/root @@ -0,0 +1 @@ +baseuri=cic:/matita diff --git a/helm/software/matita/contribs/ng_assembly2/universe/universe.ma b/helm/software/matita/contribs/ng_assembly2/universe/universe.ma new file mode 100755 index 000000000..24e5e5a18 --- /dev/null +++ b/helm/software/matita/contribs/ng_assembly2/universe/universe.ma @@ -0,0 +1,232 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| The HELM team. *) +(* ||A|| http://helm.cs.unibo.it *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU General Public License Version 2 *) +(* *) +(**************************************************************************) + +(* ********************************************************************** *) +(* Progetto FreeScale *) +(* *) +(* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppo: 2008-2010 *) +(* *) +(* ********************************************************************** *) + +include "common/nelist.ma". +include "common/prod.ma". + +nlet rec nmember_natList (elem:nat) (l:ne_list nat) on l â + match l with + [ ne_nil h â â(eqc ? elem h) + | ne_cons h t â match eqc ? elem h with + [ true â false | false â nmember_natList elem t ] + ]. + +(* elem presente una ed una sola volta in l *) +nlet rec member_natList (elem:nat) (l:ne_list nat) on l â + match l with + [ ne_nil h â eqc ? elem h + | ne_cons h t â match eqc ? elem h with + [ true â nmember_natList elem t | false â member_natList elem t ] + ]. + +(* costruttore di un sottouniverso: + S_EL cioe' uno qualsiasi degli elementi del sottouniverso +*) +ninductive S_UN (l:ne_list nat) : Type â + S_EL : Î x:nat.((member_natList x l) = true) â S_UN l. + +ndefinition getelem : âl.âe:S_UN l.nat. + #l; #s; nelim s; + #u; #dim; + napply u. +nqed. + +ndefinition eq_SUN â λl.λx,y:S_UN l.eq_nat (getelem ? x) (getelem ? y). + +ndefinition getdim : âl.âe:S_UN l.member_natList (getelem ? e) l = true. + #l; #s; nelim s; + #u; #dim; + napply dim. +nqed. + +nlemma SUN_destruct_1 + : âl.âe1,e2.âdim1,dim2.S_EL l e1 dim1 = S_EL l e2 dim2 â e1 = e2. + #l; #e1; #e2; #dim1; #dim2; #H; + nchange with (match S_EL l e2 dim2 with [ S_EL a _ â e1 = a ]); + nrewrite < H; + nnormalize; + napply refl_eq. +nqed. + +(* destruct universale *) +ndefinition SUN_destruct : âl.âx,y:S_UN l.âP:Prop.x = y â match eq_SUN l x y with [ true â P â P | false â P ]. + #l; #x; nelim x; + #u1; #dim1; + #y; nelim y; + #u2; #dim2; + #P; + nchange with (? â (match eq_nat u1 u2 with [ true â P â P | false â P ])); + #H; + nrewrite > (SUN_destruct_1 l ⦠H); + nrewrite > (eq_to_eqc ? u2 u2 (refl_eq â¦)); + nnormalize; + napply (λx.x). +nqed. + +(* eq_to_eqxx universale *) +nlemma eq_to_eqSUN : âl.âx,y:S_UN l.x = y â eq_SUN l x y = true. + #l; #x; nelim x; + #u1; #dim1; + #y; nelim y; + #u2; #dim2; + nchange with (? â eqc ? u1 u2 = true); + #H; napply (eq_to_eqc ? u1 u2); + napply (SUN_destruct_1 l ⦠H). +nqed. + +(* neqxx_to_neq universale *) +nlemma neqSUN_to_neq : âl.âx,y:S_UN l.eq_SUN l x y = false â x â y. + #l; #n1; #n2; #H; + napply (not_to_not (n1 = n2) (eq_SUN l n1 n2 = true) â¦); + ##[ ##1: napply (eq_to_eqSUN l n1 n2) + ##| ##2: napply (eqfalse_to_neqtrue ⦠H) + ##] +nqed. + +(* eqxx_to_eq universale *) +(* !!! evidente ma come si fa? *) +naxiom eqSUN_to_eq_aux : âl,x,y.((getelem l x) = (getelem l y)) â x = y. + +nlemma eqSUN_to_eq : âl.âx,y:S_UN l.eq_SUN l x y = true â x = y. + #l; #x; #y; + nchange with ((eqc ? (getelem ? x) (getelem ? y) = true) â x = y); + #H; napply (eqSUN_to_eq_aux l x y (eqc_to_eq ⦠H)). +nqed. + +(* neq_to_neqxx universale *) +nlemma neq_to_neqSUN : âl.âx,y:S_UN l.x â y â eq_SUN l x y = false. + #l; #n1; #n2; #H; + napply (neqtrue_to_eqfalse (eq_SUN l n1 n2)); + napply (not_to_not (eq_SUN l n1 n2 = true) (n1 = n2) ? H); + napply (eqSUN_to_eq l n1 n2). +nqed. + +(* decidibilita' universale *) +nlemma decidable_SUN : âl.âx,y:S_UN l.decidable (x = y). + #l; #x; #y; nnormalize; + napply (or2_elim (eq_SUN l x y = true) (eq_SUN l x y = false) ? (decidable_bexpr ?)); + ##[ ##1: #H; napply (or2_intro1 (x = y) (x â y) (eqSUN_to_eq l ⦠H)) + ##| ##2: #H; napply (or2_intro2 (x = y) (x â y) (neqSUN_to_neq l ⦠H)) + ##] +nqed. + +(* simmetria di uguaglianza universale *) +nlemma symmetric_eqSUN : âl.symmetricT (S_UN l) bool (eq_SUN l). + #l; #n1; #n2; + napply (or2_elim (n1 = n2) (n1 â n2) ? (decidable_SUN l n1 n2)); + ##[ ##1: #H; nrewrite > H; napply refl_eq + ##| ##2: #H; nrewrite > (neq_to_neqSUN l n1 n2 H); + napply (symmetric_eq ? (eq_SUN l n2 n1) false); + napply (neq_to_neqSUN l n2 n1 (symmetric_neq ? n1 n2 H)) + ##] +nqed. + +(* scheletro di funzione generica ad 1 argomento *) +nlet rec farg1_auxT (T:Type) (l:ne_list nat) on l â + match l with + [ ne_nil _ â T + | ne_cons _ t â ProdT T (farg1_auxT T t) + ]. + +nlemma farg1_auxDim : âh,t,x.eqc ? x h = false â member_natList x (h§§t) = true â member_natList x t = true. + #h; #t; #x; #H; #H1; + nnormalize in H1:(%); + nrewrite > H in H1:(%); + nnormalize; + napply (λx.x). +nqed. + +nlet rec farg1 (T:Type) (l:ne_list nat) on l â + match l with + [ ne_nil h â λarg:farg1_auxT T «£h».λx:S_UN «£h».arg + | ne_cons h t â λarg:farg1_auxT T (h§§t).λx:S_UN (h§§t). + match eqc ? (getelem ? x) h + return λy.eqc ? (getelem ? x) h = y â ? + with + [ true â λp:(eqc ? (getelem ? x) h = true).fst ⦠arg + | false â λp:(eqc ? (getelem ? x) h = false). + farg1 T t + (snd ⦠arg) + (S_EL t (getelem ? x) (farg1_auxDim h t (getelem ? x) p (getdim ? x))) + ] (refl_eq ? (eqc ? (getelem ? x) h)) + ]. + +(* scheletro di funzione generica a 2 argomenti *) +nlet rec farg2 (T:Type) (l,lfix:ne_list nat) on l â + match l with + [ ne_nil h â λarg:farg1_auxT (farg1_auxT T lfix) «£h».λx:S_UN «£h».farg1 T lfix arg + | ne_cons h t â λarg:farg1_auxT (farg1_auxT T lfix) (h§§t).λx:S_UN (h§§t). + match eqc ? (getelem ? x) h + return λy.eqc ? (getelem ? x) h = y â ? + with + [ true â λp:(eqc ? (getelem ? x) h = true).farg1 T lfix (fst ⦠arg) + | false â λp:(eqc ? (getelem ? x) h = false). + farg2 T t lfix + (snd ⦠arg) + (S_EL t (getelem ? x) (farg1_auxDim h t (getelem ? x) p (getdim ? x))) + ] (refl_eq ? (eqc ? (getelem ? x) h)) + ]. + +(* esempio0: universo ottale *) +ndefinition oct0 â O. +ndefinition oct1 â nat1. +ndefinition oct2 â nat2. +ndefinition oct3 â nat3. +ndefinition oct4 â nat4. +ndefinition oct5 â nat5. +ndefinition oct6 â nat6. +ndefinition oct7 â nat7. + +ndefinition oct_UN â « oct0 ; oct1 ; oct2 ; oct3 ; oct4 ; oct5 ; oct6 £ oct7 ». + +ndefinition uoct0 â S_EL oct_UN oct0 (refl_eq â¦). +ndefinition uoct1 â S_EL oct_UN oct1 (refl_eq â¦). +ndefinition uoct2 â S_EL oct_UN oct2 (refl_eq â¦). +ndefinition uoct3 â S_EL oct_UN oct3 (refl_eq â¦). +ndefinition uoct4 â S_EL oct_UN oct4 (refl_eq â¦). +ndefinition uoct5 â S_EL oct_UN oct5 (refl_eq â¦). +ndefinition uoct6 â S_EL oct_UN oct6 (refl_eq â¦). +ndefinition uoct7 â S_EL oct_UN oct7 (refl_eq â¦). + +(* esempio1: NOT ottale *) +ndefinition octNOT â + farg1 (S_UN oct_UN) oct_UN + (pair ⦠uoct7 (pair ⦠uoct6 (pair ⦠uoct5 (pair ⦠uoct4 (pair ⦠uoct3 (pair ⦠uoct2 (pair ⦠uoct1 uoct0))))))). + +(* esempio2: AND ottale *) +ndefinition octAND0 â pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct0 uoct0)))))). +ndefinition octAND1 â pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct0 uoct1)))))). +ndefinition octAND2 â pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct2 (pair ⦠uoct2 (pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct2 uoct2)))))). +ndefinition octAND3 â pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct2 (pair ⦠uoct3 (pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct2 uoct3)))))). +ndefinition octAND4 â pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct4 (pair ⦠uoct4 (pair ⦠uoct4 uoct4)))))). +ndefinition octAND5 â pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct4 (pair ⦠uoct5 (pair ⦠uoct4 uoct5)))))). +ndefinition octAND6 â pair ⦠uoct0 (pair ⦠uoct0 (pair ⦠uoct2 (pair ⦠uoct2 (pair ⦠uoct4 (pair ⦠uoct4 (pair ⦠uoct6 uoct6)))))). +ndefinition octAND7 â pair ⦠uoct0 (pair ⦠uoct1 (pair ⦠uoct2 (pair ⦠uoct3 (pair ⦠uoct4 (pair ⦠uoct5 (pair ⦠uoct6 uoct7)))))). + +ndefinition octAND â + farg2 (S_UN oct_UN) oct_UN oct_UN + (pair ⦠octAND0 (pair ⦠octAND1 (pair ⦠octAND2 (pair ⦠octAND3 (pair ⦠octAND4 (pair ⦠octAND5 (pair ⦠octAND6 octAND7))))))). + +(* ora e' possibile fare + octNOT uoctX + octAND uoctX uoctY +*)