X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Fcontribs%2Fng_assembly%2Ffreescale%2Fprod_lemmas.ma;h=7c9043921ba5c179f8cae8f23638b538e79df763;hb=f538a0b46ba4164a21a76e47a6ed3b3e9deb5041;hp=96bc15172b9f334b0f56c3c69b664c4e080bbce0;hpb=64bdbee95e40a5be3bb6c5c2866869103730a4d0;p=helm.git diff --git a/helm/software/matita/contribs/ng_assembly/freescale/prod_lemmas.ma b/helm/software/matita/contribs/ng_assembly/freescale/prod_lemmas.ma index 96bc15172..7c9043921 100644 --- a/helm/software/matita/contribs/ng_assembly/freescale/prod_lemmas.ma +++ b/helm/software/matita/contribs/ng_assembly/freescale/prod_lemmas.ma @@ -13,15 +13,11 @@ (**************************************************************************) (* ********************************************************************** *) -(* Progetto FreeScale *) +(* Progetto FreeScale *) (* *) -(* Sviluppato da: *) -(* Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Sviluppato da: Cosimo Oliboni, oliboni@cs.unibo.it *) +(* Cosimo Oliboni, oliboni@cs.unibo.it *) (* *) -(* Questo materiale fa parte della tesi: *) -(* "Formalizzazione Interattiva dei Microcontroller a 8bit FreeScale" *) -(* *) -(* data ultima modifica 15/11/2007 *) (* ********************************************************************** *) include "freescale/bool_lemmas.ma". @@ -38,7 +34,7 @@ nlemma pair_destruct_1 : nchange with (match pair T1 T2 x2 y2 with [ pair a _ ⇒ x1 = a ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. nlemma pair_destruct_2 : @@ -48,25 +44,26 @@ nlemma pair_destruct_2 : nchange with (match pair T1 T2 x2 y2 with [ pair _ b ⇒ y1 = b ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. -nlemma bsymmetric_eqpair : +nlemma symmetric_eqpair : ∀T1,T2:Type.∀p1,p2:ProdT T1 T2. ∀f1:T1 → T1 → bool.∀f2:T2 → T2 → bool. (symmetricT T1 bool f1) → (symmetricT T2 bool f2) → (eq_pair T1 T2 p1 p2 f1 f2 = eq_pair T1 T2 p2 p1 f1 f2). #T1; #T2; #p1; #p2; #f1; #f2; #H; #H1; - ncases p1; - ncases p2; - #x2; #y2; #x1; #y1; + nelim p1; + #x1; #y1; + 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 ??) + ##[ ##1: nrewrite > (H1 y1 y2); napply refl_eq + ##| ##2: napply refl_eq ##] nqed. @@ -77,14 +74,15 @@ nlemma eq_to_eqpair : (∀y1,y2:T2.y1 = y2 → f2 y1 y2 = true) → (p1 = p2 → eq_pair T1 T2 p1 p2 f1 f2 = true). #T1; #T2; #p1; #p2; #f1; #f2; #H1; #H2; - ncases p1; - ncases p2; - #x2; #y2; #x1; #y1; #H; + nelim p1; + #x1; #y1; + nelim p2; + #x2; #y2; #H; nnormalize; - nrewrite > (H1 ?? (pair_destruct_1 ?????? H)); + nrewrite > (H1 … (pair_destruct_1 … H)); nnormalize; - nrewrite > (H2 ?? (pair_destruct_2 ?????? H)); - napply (refl_eq ??). + nrewrite > (H2 … (pair_destruct_2 … H)); + napply refl_eq. nqed. nlemma eqpair_to_eq : @@ -94,19 +92,20 @@ nlemma eqpair_to_eq : (∀y1,y2:T2.f2 y1 y2 = true → y1 = y2) → (eq_pair T1 T2 p1 p2 f1 f2 = true → p1 = p2). #T1; #T2; #p1; #p2; #f1; #f2; #H1; #H2; - ncases p1; - ncases p2; - #x2; #y2; #x1; #y1; #H; + nelim p1; + #x1; #y1; + nelim p2; + #x2; #y2; #H; nnormalize in H:(%); nletin K ≝ (H1 x1 x2); ncases (f1 x1 x2) in H:(%) K:(%); nnormalize; #H3; - ##[ ##2: napply (bool_destruct ??? H3) ##] + ##[ ##2: napply (bool_destruct … H3) ##] #H4; - nrewrite > (H4 (refl_eq ??)); + nrewrite > (H4 (refl_eq …)); nrewrite > (H2 y1 y2 H3); - napply (refl_eq ??). + napply refl_eq. nqed. nlemma triple_destruct_1 : @@ -116,7 +115,7 @@ nlemma triple_destruct_1 : nchange with (match triple T1 T2 T3 x2 y2 z2 with [ triple a _ _ ⇒ x1 = a ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. nlemma triple_destruct_2 : @@ -126,7 +125,7 @@ nlemma triple_destruct_2 : nchange with (match triple T1 T2 T3 x2 y2 z2 with [ triple _ b _ ⇒ y1 = b ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. nlemma triple_destruct_3 : @@ -136,10 +135,10 @@ nlemma triple_destruct_3 : nchange with (match triple T1 T2 T3 x2 y2 z2 with [ triple _ _ c ⇒ z1 = c ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. -nlemma bsymmetric_eqtriple : +nlemma symmetric_eqtriple : ∀T1,T2,T3:Type.∀p1,p2:Prod3T T1 T2 T3. ∀f1:T1 → T1 → bool.∀f2:T2 → T2 → bool.∀f3:T3 → T3 → bool. (symmetricT T1 bool f1) → @@ -147,9 +146,10 @@ nlemma bsymmetric_eqtriple : (symmetricT T3 bool f3) → (eq_triple T1 T2 T3 p1 p2 f1 f2 f3 = eq_triple T1 T2 T3 p2 p1 f1 f2 f3). #T1; #T2; #T3; #p1; #p2; #f1; #f2; #f3; #H; #H1; #H2; - ncases p1; - ncases p2; - #x2; #y2; #z2; #x1; #y1; #z1; + nelim p1; + #x1; #y1; #z1; + nelim p2; + #x2; #y2; #z2; nnormalize; nrewrite > (H x1 x2); ncases (f1 x2 x1); @@ -157,10 +157,10 @@ nlemma bsymmetric_eqtriple : ##[ ##1: nrewrite > (H1 y1 y2); ncases (f2 y2 y1); nnormalize; - ##[ ##1: nrewrite > (H2 z1 z2); napply (refl_eq ??) - ##| ##2: napply (refl_eq ??) + ##[ ##1: nrewrite > (H2 z1 z2); napply refl_eq + ##| ##2: napply refl_eq ##] - ##| ##2: napply (refl_eq ??) + ##| ##2: napply refl_eq ##] nqed. @@ -172,16 +172,17 @@ nlemma eq_to_eqtriple : (∀z1,z2:T3.z1 = z2 → f3 z1 z2 = true) → (p1 = p2 → eq_triple T1 T2 T3 p1 p2 f1 f2 f3 = true). #T1; #T2; #T3; #p1; #p2; #f1; #f2; #f3; #H1; #H2; #H3; - ncases p1; - ncases p2; - #x2; #y2; #z2; #x1; #y1; #z1; #H; + nelim p1; + #x1; #y1; #z1; + nelim p2; + #x2; #y2; #z2; #H; nnormalize; - nrewrite > (H1 ?? (triple_destruct_1 ????????? H)); + nrewrite > (H1 … (triple_destruct_1 … H)); nnormalize; - nrewrite > (H2 ?? (triple_destruct_2 ????????? H)); + nrewrite > (H2 … (triple_destruct_2 … H)); nnormalize; - nrewrite > (H3 ?? (triple_destruct_3 ????????? H)); - napply (refl_eq ??). + nrewrite > (H3 … (triple_destruct_3 … H)); + napply refl_eq. nqed. nlemma eqtriple_to_eq : @@ -192,23 +193,24 @@ nlemma eqtriple_to_eq : (∀z1,z2:T3.f3 z1 z2 = true → z1 = z2) → (eq_triple T1 T2 T3 p1 p2 f1 f2 f3 = true → p1 = p2). #T1; #T2; #T3; #p1; #p2; #f1; #f2; #f3; #H1; #H2; #H3; - ncases p1; - ncases p2; - #x2; #y2; #z2; #x1; #y1; #z1; #H; + nelim p1; + #x1; #y1; #z1; + nelim p2; + #x2; #y2; #z2; #H; nnormalize in H:(%); nletin K ≝ (H1 x1 x2); ncases (f1 x1 x2) in H:(%) K:(%); nnormalize; - ##[ ##2: #H4; napply (bool_destruct ??? H4) ##] + ##[ ##2: #H4; napply (bool_destruct … H4) ##] nletin K1 ≝ (H2 y1 y2); ncases (f2 y1 y2) in K1:(%) ⊢ %; nnormalize; - ##[ ##2: #H4; #H5; napply (bool_destruct ??? H5) ##] + ##[ ##2: #H4; #H5; napply (bool_destruct … H5) ##] #H4; #H5; #H6; - nrewrite > (H4 (refl_eq ??)); - nrewrite > (H6 (refl_eq ??)); + nrewrite > (H4 (refl_eq …)); + nrewrite > (H6 (refl_eq …)); nrewrite > (H3 z1 z2 H5); - napply (refl_eq ??). + napply refl_eq. nqed. nlemma quadruple_destruct_1 : @@ -218,7 +220,7 @@ nlemma quadruple_destruct_1 : nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple a _ _ _ ⇒ x1 = a ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. nlemma quadruple_destruct_2 : @@ -228,7 +230,7 @@ nlemma quadruple_destruct_2 : nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple _ b _ _ ⇒ y1 = b ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. nlemma quadruple_destruct_3 : @@ -238,7 +240,7 @@ nlemma quadruple_destruct_3 : nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple _ _ c _ ⇒ z1 = c ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. nlemma quadruple_destruct_4 : @@ -248,10 +250,10 @@ nlemma quadruple_destruct_4 : nchange with (match quadruple T1 T2 T3 T4 x2 y2 z2 v2 with [ quadruple _ _ _ d ⇒ v1 = d ]); nrewrite < H; nnormalize; - napply (refl_eq ??). + napply refl_eq. nqed. -nlemma bsymmetric_eqquadruple : +nlemma symmetric_eqquadruple : ∀T1,T2,T3,T4:Type.∀p1,p2:Prod4T T1 T2 T3 T4. ∀f1:T1 → T1 → bool.∀f2:T2 → T2 → bool.∀f3:T3 → T3 → bool.∀f4:T4 → T4 → bool. (symmetricT T1 bool f1) → @@ -260,9 +262,10 @@ nlemma bsymmetric_eqquadruple : (symmetricT T4 bool f4) → (eq_quadruple T1 T2 T3 T4 p1 p2 f1 f2 f3 f4 = eq_quadruple T1 T2 T3 T4 p2 p1 f1 f2 f3 f4). #T1; #T2; #T3; #T4; #p1; #p2; #f1; #f2; #f3; #f4; #H; #H1; #H2; #H3; - ncases p1; - ncases p2; - #x2; #y2; #z2; #v2; #x1; #y1; #z1; #v1; + nelim p1; + #x1; #y1; #z1; #v1; + nelim p2; + #x2; #y2; #z2; #v2; nnormalize; nrewrite > (H x1 x2); ncases (f1 x2 x1); @@ -273,12 +276,12 @@ nlemma bsymmetric_eqquadruple : ##[ ##1: nrewrite > (H2 z1 z2); ncases (f3 z2 z1); nnormalize; - ##[ ##1: nrewrite > (H3 v1 v2); napply (refl_eq ??) - ##| ##2: napply (refl_eq ??) + ##[ ##1: nrewrite > (H3 v1 v2); napply refl_eq + ##| ##2: napply refl_eq ##] - ##| ##2: napply (refl_eq ??) + ##| ##2: napply refl_eq ##] - ##| ##2: napply (refl_eq ??) + ##| ##2: napply refl_eq ##] nqed. @@ -291,18 +294,19 @@ nlemma eq_to_eqquadruple : (∀v1,v2:T4.v1 = v2 → f4 v1 v2 = true) → (p1 = p2 → eq_quadruple T1 T2 T3 T4 p1 p2 f1 f2 f3 f4 = true). #T1; #T2; #T3; #T4; #p1; #p2; #f1; #f2; #f3; #f4; #H1; #H2; #H3; #H4; - ncases p1; - ncases p2; - #x2; #y2; #z2; #v2; #x1; #y1; #z1; #v1; #H; + nelim p1; + #x1; #y1; #z1; #v1; + nelim p2; + #x2; #y2; #z2; #v2; #H; nnormalize; - nrewrite > (H1 ?? (quadruple_destruct_1 ???????????? H)); + nrewrite > (H1 … (quadruple_destruct_1 … H)); nnormalize; - nrewrite > (H2 ?? (quadruple_destruct_2 ???????????? H)); + nrewrite > (H2 … (quadruple_destruct_2 … H)); nnormalize; - nrewrite > (H3 ?? (quadruple_destruct_3 ???????????? H)); + nrewrite > (H3 … (quadruple_destruct_3 … H)); nnormalize; - nrewrite > (H4 ?? (quadruple_destruct_4 ???????????? H)); - napply (refl_eq ??). + nrewrite > (H4 … (quadruple_destruct_4 … H)); + napply refl_eq. nqed. nlemma eqquadruple_to_eq : @@ -314,28 +318,29 @@ nlemma eqquadruple_to_eq : (∀v1,v2:T4.f4 v1 v2 = true → v1 = v2) → (eq_quadruple T1 T2 T3 T4 p1 p2 f1 f2 f3 f4 = true → p1 = p2). #T1; #T2; #T3; #T4; #p1; #p2; #f1; #f2; #f3; #f4; #H1; #H2; #H3; #H4; - ncases p1; - ncases p2; - #x2; #y2; #z2; #v2; #x1; #y1; #z1; #v1; #H; + nelim p1; + #x1; #y1; #z1; #v1; + 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; napply (bool_destruct ??? H5) ##] + ##[ ##2: #H5; napply (bool_destruct … H5) ##] nletin K1 ≝ (H2 y1 y2); ncases (f2 y1 y2) in K1:(%) ⊢ %; nnormalize; - ##[ ##2: #H5; #H6; napply (bool_destruct ??? H6) ##] + ##[ ##2: #H5; #H6; napply (bool_destruct … H6) ##] nletin K2 ≝ (H3 z1 z2); ncases (f3 z1 z2) in K2:(%) ⊢ %; nnormalize; - ##[ ##2: #H5; #H6; #H7; napply (bool_destruct ??? H7) ##] + ##[ ##2: #H5; #H6; #H7; napply (bool_destruct … H7) ##] #H5; #H6; #H7; #H8; - nrewrite > (H5 (refl_eq ??)); - nrewrite > (H6 (refl_eq ??)); - nrewrite > (H8 (refl_eq ??)); + nrewrite > (H5 (refl_eq …)); + nrewrite > (H6 (refl_eq …)); + nrewrite > (H8 (refl_eq …)); nrewrite > (H4 v1 v2 H7); - napply (refl_eq ??). + napply refl_eq. nqed. nlemma quintuple_destruct_1 : @@ -345,7 +350,7 @@ nlemma quintuple_destruct_1 : 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 ??). + napply refl_eq. nqed. nlemma quintuple_destruct_2 : @@ -355,7 +360,7 @@ nlemma quintuple_destruct_2 : 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 ??). + napply refl_eq. nqed. nlemma quintuple_destruct_3 : @@ -365,7 +370,7 @@ nlemma quintuple_destruct_3 : 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 ??). + napply refl_eq. nqed. nlemma quintuple_destruct_4 : @@ -375,7 +380,7 @@ nlemma quintuple_destruct_4 : 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 ??). + napply refl_eq. nqed. nlemma quintuple_destruct_5 : @@ -385,10 +390,10 @@ nlemma quintuple_destruct_5 : 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 ??). + napply refl_eq. nqed. -nlemma bsymmetric_eqquintuple : +nlemma symmetric_eqquintuple : ∀T1,T2,T3,T4,T5:Type.∀p1,p2:Prod5T 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. (symmetricT T1 bool f1) → @@ -398,9 +403,10 @@ nlemma bsymmetric_eqquintuple : (symmetricT T5 bool f5) → (eq_quintuple T1 T2 T3 T4 T5 p1 p2 f1 f2 f3 f4 f5 = eq_quintuple T1 T2 T3 T4 T5 p2 p1 f1 f2 f3 f4 f5). #T1; #T2; #T3; #T4; #T5; #p1; #p2; #f1; #f2; #f3; #f4; #f5; #H; #H1; #H2; #H3; #H4; - ncases p1; - ncases p2; - #x2; #y2; #z2; #v2; #w2; #x1; #y1; #z1; #v1; #w1; + nelim p1; + #x1; #y1; #z1; #v1; #w1; + nelim p2; + #x2; #y2; #z2; #v2; #w2; nnormalize; nrewrite > (H x1 x2); ncases (f1 x2 x1); @@ -414,14 +420,14 @@ nlemma bsymmetric_eqquintuple : ##[ ##1: nrewrite > (H3 v1 v2); ncases (f4 v2 v1); nnormalize; - ##[ ##1: nrewrite > (H4 w1 w2); napply (refl_eq ??) - ##| ##2: napply (refl_eq ??) + ##[ ##1: nrewrite > (H4 w1 w2); napply refl_eq + ##| ##2: napply refl_eq ##] - ##| ##2: napply (refl_eq ??) + ##| ##2: napply refl_eq ##] - ##| ##2: napply (refl_eq ??) + ##| ##2: napply refl_eq ##] - ##| ##2: napply (refl_eq ??) + ##| ##2: napply refl_eq ##] nqed. @@ -435,20 +441,21 @@ nlemma eq_to_eqquintuple : (∀w1,w2:T5.w1 = w2 → f5 w1 w2 = true) → (p1 = p2 → eq_quintuple T1 T2 T3 T4 T5 p1 p2 f1 f2 f3 f4 f5 = true). #T1; #T2; #T3; #T4; #T5; #p1; #p2; #f1; #f2; #f3; #f4; #f5; #H1; #H2; #H3; #H4; #H5; - ncases p1; - ncases p2; - #x2; #y2; #z2; #v2; #w2; #x1; #y1; #z1; #v1; #w1; #H; + nelim p1; + #x1; #y1; #z1; #v1; #w1; + nelim p2; + #x2; #y2; #z2; #v2; #w2; #H; nnormalize; - nrewrite > (H1 ?? (quintuple_destruct_1 ??????????????? H)); + nrewrite > (H1 … (quintuple_destruct_1 … H)); nnormalize; - nrewrite > (H2 ?? (quintuple_destruct_2 ??????????????? H)); + nrewrite > (H2 … (quintuple_destruct_2 … H)); nnormalize; - nrewrite > (H3 ?? (quintuple_destruct_3 ??????????????? H)); + nrewrite > (H3 … (quintuple_destruct_3 … H)); nnormalize; - nrewrite > (H4 ?? (quintuple_destruct_4 ??????????????? H)); + nrewrite > (H4 … (quintuple_destruct_4 … H)); nnormalize; - nrewrite > (H5 ?? (quintuple_destruct_5 ??????????????? H)); - napply (refl_eq ??). + nrewrite > (H5 … (quintuple_destruct_5 … H)); + napply refl_eq. nqed. nlemma eqquintuple_to_eq : @@ -461,31 +468,32 @@ nlemma eqquintuple_to_eq : (∀w1,w2:T5.f5 w1 w2 = true → w1 = w2) → (eq_quintuple T1 T2 T3 T4 T5 p1 p2 f1 f2 f3 f4 f5 = true → p1 = p2). #T1; #T2; #T3; #T4; #T5; #p1; #p2; #f1; #f2; #f3; #f4; #f5; #H1; #H2; #H3; #H4; #H5; - ncases p1; - ncases p2; - #x2; #y2; #z2; #v2; #w2; #x1; #y1; #z1; #v1; #w1; #H; + nelim p1; + #x1; #y1; #z1; #v1; #w1; + 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; napply (bool_destruct ??? H6) ##] + ##[ ##2: #H6; napply (bool_destruct … H6) ##] nletin K1 ≝ (H2 y1 y2); ncases (f2 y1 y2) in K1:(%) ⊢ %; nnormalize; - ##[ ##2: #H6; #H7; napply (bool_destruct ??? H7) ##] + ##[ ##2: #H6; #H7; napply (bool_destruct … H7) ##] nletin K2 ≝ (H3 z1 z2); ncases (f3 z1 z2) in K2:(%) ⊢ %; nnormalize; - ##[ ##2: #H6; #H7; #H8; napply (bool_destruct ??? H8) ##] + ##[ ##2: #H6; #H7; #H8; napply (bool_destruct … H8) ##] nletin K3 ≝ (H4 v1 v2); ncases (f4 v1 v2) in K3:(%) ⊢ %; nnormalize; - ##[ ##2: #H6; #H7; #H8; #H9; napply (bool_destruct ??? H9) ##] + ##[ ##2: #H6; #H7; #H8; #H9; 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 > (H6 (refl_eq …)); + nrewrite > (H7 (refl_eq …)); + nrewrite > (H8 (refl_eq …)); + nrewrite > (H10 (refl_eq …)); nrewrite > (H5 w1 w2 H9); - napply (refl_eq ??). + napply refl_eq. nqed.