291 |
291 |
292 lemma bound0_qf: "bound0 p \<Longrightarrow> qfree p" |
292 lemma bound0_qf: "bound0 p \<Longrightarrow> qfree p" |
293 by (induct p, simp_all) |
293 by (induct p, simp_all) |
294 |
294 |
295 |
295 |
296 constdefs djf:: "('a \<Rightarrow> fm) \<Rightarrow> 'a \<Rightarrow> fm \<Rightarrow> fm" |
296 definition djf :: "('a \<Rightarrow> fm) \<Rightarrow> 'a \<Rightarrow> fm \<Rightarrow> fm" where |
297 "djf f p q \<equiv> (if q=T then T else if q=F then f p else |
297 "djf f p q \<equiv> (if q=T then T else if q=F then f p else |
298 (let fp = f p in case fp of T \<Rightarrow> T | F \<Rightarrow> q | _ \<Rightarrow> Or (f p) q))" |
298 (let fp = f p in case fp of T \<Rightarrow> T | F \<Rightarrow> q | _ \<Rightarrow> Or (f p) q))" |
299 constdefs evaldjf:: "('a \<Rightarrow> fm) \<Rightarrow> 'a list \<Rightarrow> fm" |
299 definition evaldjf :: "('a \<Rightarrow> fm) \<Rightarrow> 'a list \<Rightarrow> fm" where |
300 "evaldjf f ps \<equiv> foldr (djf f) ps F" |
300 "evaldjf f ps \<equiv> foldr (djf f) ps F" |
301 |
301 |
302 lemma djf_Or: "Ifm bbs bs (djf f p q) = Ifm bbs bs (Or (f p) q)" |
302 lemma djf_Or: "Ifm bbs bs (djf f p q) = Ifm bbs bs (Or (f p) q)" |
303 by (cases "q=T", simp add: djf_def,cases "q=F",simp add: djf_def) |
303 by (cases "q=T", simp add: djf_def,cases "q=F",simp add: djf_def) |
304 (cases "f p", simp_all add: Let_def djf_def) |
304 (cases "f p", simp_all add: Let_def djf_def) |
393 "bnds a = []" |
393 "bnds a = []" |
394 recdef lex_ns "measure (\<lambda> (xs,ys). length xs + length ys)" |
394 recdef lex_ns "measure (\<lambda> (xs,ys). length xs + length ys)" |
395 "lex_ns ([], ms) = True" |
395 "lex_ns ([], ms) = True" |
396 "lex_ns (ns, []) = False" |
396 "lex_ns (ns, []) = False" |
397 "lex_ns (n#ns, m#ms) = (n<m \<or> ((n = m) \<and> lex_ns (ns,ms))) " |
397 "lex_ns (n#ns, m#ms) = (n<m \<or> ((n = m) \<and> lex_ns (ns,ms))) " |
398 constdefs lex_bnd :: "num \<Rightarrow> num \<Rightarrow> bool" |
398 definition lex_bnd :: "num \<Rightarrow> num \<Rightarrow> bool" where |
399 "lex_bnd t s \<equiv> lex_ns (bnds t, bnds s)" |
399 "lex_bnd t s \<equiv> lex_ns (bnds t, bnds s)" |
400 |
400 |
401 consts |
401 consts |
402 numadd:: "num \<times> num \<Rightarrow> num" |
402 numadd:: "num \<times> num \<Rightarrow> num" |
403 recdef numadd "measure (\<lambda> (t,s). num_size t + num_size s)" |
403 recdef numadd "measure (\<lambda> (t,s). num_size t + num_size s)" |
453 by (induct t rule: nummul.induct, auto simp add: algebra_simps numadd) |
453 by (induct t rule: nummul.induct, auto simp add: algebra_simps numadd) |
454 |
454 |
455 lemma nummul_nb: "\<And> i. numbound0 t \<Longrightarrow> numbound0 (nummul i t)" |
455 lemma nummul_nb: "\<And> i. numbound0 t \<Longrightarrow> numbound0 (nummul i t)" |
456 by (induct t rule: nummul.induct, auto simp add: numadd_nb) |
456 by (induct t rule: nummul.induct, auto simp add: numadd_nb) |
457 |
457 |
458 constdefs numneg :: "num \<Rightarrow> num" |
458 definition numneg :: "num \<Rightarrow> num" where |
459 "numneg t \<equiv> nummul (- 1) t" |
459 "numneg t \<equiv> nummul (- 1) t" |
460 |
460 |
461 constdefs numsub :: "num \<Rightarrow> num \<Rightarrow> num" |
461 definition numsub :: "num \<Rightarrow> num \<Rightarrow> num" where |
462 "numsub s t \<equiv> (if s = t then C 0 else numadd (s, numneg t))" |
462 "numsub s t \<equiv> (if s = t then C 0 else numadd (s, numneg t))" |
463 |
463 |
464 lemma numneg: "Inum bs (numneg t) = Inum bs (Neg t)" |
464 lemma numneg: "Inum bs (numneg t) = Inum bs (Neg t)" |
465 using numneg_def nummul by simp |
465 using numneg_def nummul by simp |
466 |
466 |
503 lemma not_qf: "qfree p \<Longrightarrow> qfree (not p)" |
503 lemma not_qf: "qfree p \<Longrightarrow> qfree (not p)" |
504 by (cases p, auto) |
504 by (cases p, auto) |
505 lemma not_bn: "bound0 p \<Longrightarrow> bound0 (not p)" |
505 lemma not_bn: "bound0 p \<Longrightarrow> bound0 (not p)" |
506 by (cases p, auto) |
506 by (cases p, auto) |
507 |
507 |
508 constdefs conj :: "fm \<Rightarrow> fm \<Rightarrow> fm" |
508 definition conj :: "fm \<Rightarrow> fm \<Rightarrow> fm" where |
509 "conj p q \<equiv> (if (p = F \<or> q=F) then F else if p=T then q else if q=T then p else And p q)" |
509 "conj p q \<equiv> (if (p = F \<or> q=F) then F else if p=T then q else if q=T then p else And p q)" |
510 lemma conj: "Ifm bbs bs (conj p q) = Ifm bbs bs (And p q)" |
510 lemma conj: "Ifm bbs bs (conj p q) = Ifm bbs bs (And p q)" |
511 by (cases "p=F \<or> q=F",simp_all add: conj_def) (cases p,simp_all) |
511 by (cases "p=F \<or> q=F",simp_all add: conj_def) (cases p,simp_all) |
512 |
512 |
513 lemma conj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (conj p q)" |
513 lemma conj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (conj p q)" |
514 using conj_def by auto |
514 using conj_def by auto |
515 lemma conj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (conj p q)" |
515 lemma conj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (conj p q)" |
516 using conj_def by auto |
516 using conj_def by auto |
517 |
517 |
518 constdefs disj :: "fm \<Rightarrow> fm \<Rightarrow> fm" |
518 definition disj :: "fm \<Rightarrow> fm \<Rightarrow> fm" where |
519 "disj p q \<equiv> (if (p = T \<or> q=T) then T else if p=F then q else if q=F then p else Or p q)" |
519 "disj p q \<equiv> (if (p = T \<or> q=T) then T else if p=F then q else if q=F then p else Or p q)" |
520 |
520 |
521 lemma disj: "Ifm bbs bs (disj p q) = Ifm bbs bs (Or p q)" |
521 lemma disj: "Ifm bbs bs (disj p q) = Ifm bbs bs (Or p q)" |
522 by (cases "p=T \<or> q=T",simp_all add: disj_def) (cases p,simp_all) |
522 by (cases "p=T \<or> q=T",simp_all add: disj_def) (cases p,simp_all) |
523 lemma disj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (disj p q)" |
523 lemma disj_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (disj p q)" |
524 using disj_def by auto |
524 using disj_def by auto |
525 lemma disj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (disj p q)" |
525 lemma disj_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (disj p q)" |
526 using disj_def by auto |
526 using disj_def by auto |
527 |
527 |
528 constdefs imp :: "fm \<Rightarrow> fm \<Rightarrow> fm" |
528 definition imp :: "fm \<Rightarrow> fm \<Rightarrow> fm" where |
529 "imp p q \<equiv> (if (p = F \<or> q=T) then T else if p=T then q else if q=F then not p else Imp p q)" |
529 "imp p q \<equiv> (if (p = F \<or> q=T) then T else if p=T then q else if q=F then not p else Imp p q)" |
530 lemma imp: "Ifm bbs bs (imp p q) = Ifm bbs bs (Imp p q)" |
530 lemma imp: "Ifm bbs bs (imp p q) = Ifm bbs bs (Imp p q)" |
531 by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not) |
531 by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not) |
532 lemma imp_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (imp p q)" |
532 lemma imp_qf: "\<lbrakk>qfree p ; qfree q\<rbrakk> \<Longrightarrow> qfree (imp p q)" |
533 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not_qf) |
533 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) (simp_all add: not_qf) |
534 lemma imp_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (imp p q)" |
534 lemma imp_nb: "\<lbrakk>bound0 p ; bound0 q\<rbrakk> \<Longrightarrow> bound0 (imp p q)" |
535 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) simp_all |
535 using imp_def by (cases "p=F \<or> q=T",simp_all add: imp_def,cases p) simp_all |
536 |
536 |
537 constdefs iff :: "fm \<Rightarrow> fm \<Rightarrow> fm" |
537 definition iff :: "fm \<Rightarrow> fm \<Rightarrow> fm" where |
538 "iff p q \<equiv> (if (p = q) then T else if (p = not q \<or> not p = q) then F else |
538 "iff p q \<equiv> (if (p = q) then T else if (p = not q \<or> not p = q) then F else |
539 if p=F then not q else if q=F then not p else if p=T then q else if q=T then p else |
539 if p=F then not q else if q=F then not p else if p=T then q else if q=T then p else |
540 Iff p q)" |
540 Iff p q)" |
541 lemma iff: "Ifm bbs bs (iff p q) = Ifm bbs bs (Iff p q)" |
541 lemma iff: "Ifm bbs bs (iff p q) = Ifm bbs bs (Iff p q)" |
542 by (unfold iff_def,cases "p=q", simp,cases "p=not q", simp add:not) |
542 by (unfold iff_def,cases "p=q", simp,cases "p=not q", simp add:not) |
1747 assumes lp: "iszlfm p" |
1747 assumes lp: "iszlfm p" |
1748 and up: "d\<beta> p 1" and dd: "d\<delta> p d" and dp: "d > 0" |
1748 and up: "d\<beta> p 1" and dd: "d\<delta> p d" and dp: "d > 0" |
1749 shows "(\<exists> x. Ifm bbs (x#bs) p) = ((\<exists> j\<in> {1 .. d}. Ifm bbs (j#bs) (minusinf p)) \<or> (\<exists> j\<in> {1.. d}. \<exists> b\<in> (Inum (i#bs)) ` set (\<beta> p). Ifm bbs ((b+j)#bs) p))" |
1749 shows "(\<exists> x. Ifm bbs (x#bs) p) = ((\<exists> j\<in> {1 .. d}. Ifm bbs (j#bs) (minusinf p)) \<or> (\<exists> j\<in> {1.. d}. \<exists> b\<in> (Inum (i#bs)) ` set (\<beta> p). Ifm bbs ((b+j)#bs) p))" |
1750 using cp_thm[OF lp up dd dp,where i="i"] by auto |
1750 using cp_thm[OF lp up dd dp,where i="i"] by auto |
1751 |
1751 |
1752 constdefs unit:: "fm \<Rightarrow> fm \<times> num list \<times> int" |
1752 definition unit :: "fm \<Rightarrow> fm \<times> num list \<times> int" where |
1753 "unit p \<equiv> (let p' = zlfm p ; l = \<zeta> p' ; q = And (Dvd l (CN 0 1 (C 0))) (a\<beta> p' l); d = \<delta> q; |
1753 "unit p \<equiv> (let p' = zlfm p ; l = \<zeta> p' ; q = And (Dvd l (CN 0 1 (C 0))) (a\<beta> p' l); d = \<delta> q; |
1754 B = remdups (map simpnum (\<beta> q)) ; a = remdups (map simpnum (\<alpha> q)) |
1754 B = remdups (map simpnum (\<beta> q)) ; a = remdups (map simpnum (\<alpha> q)) |
1755 in if length B \<le> length a then (q,B,d) else (mirror q, a,d))" |
1755 in if length B \<le> length a then (q,B,d) else (mirror q, a,d))" |
1756 |
1756 |
1757 lemma unit: assumes qf: "qfree p" |
1757 lemma unit: assumes qf: "qfree p" |