# HG changeset patch # User boehmes # Date 1273701244 -7200 # Node ID bcd6fce5bf06f6ce7e8c20e6a7440ff99bb8269e # Parent 8e55aa1306c58d2799143f907b5f2a60b1cb21e4 layered SMT setup, adapted SMT clients, added further tests, made Z3 proof abstraction configurable diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Boogie/Boogie.thy --- a/src/HOL/Boogie/Boogie.thy Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Boogie/Boogie.thy Wed May 12 23:54:04 2010 +0200 @@ -5,7 +5,7 @@ header {* Integration of the Boogie program verifier *} theory Boogie -imports "~~/src/HOL/SMT/SMT" +imports Word uses ("Tools/boogie_vcs.ML") ("Tools/boogie_loader.ML") diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Boogie/Tools/boogie_loader.ML --- a/src/HOL/Boogie/Tools/boogie_loader.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Boogie/Tools/boogie_loader.ML Wed May 12 23:54:04 2010 +0200 @@ -122,6 +122,7 @@ | "bvneg" => const @{const_name uminus} | "bvsub" => const @{const_name minus} | "bvmul" => const @{const_name times} +(* FIXME: | "bvudiv" => const @{const_name div} | "bvurem" => const @{const_name mod} | "bvsdiv" => const @{const_name sdiv} @@ -129,6 +130,7 @@ | "bvshl" => const @{const_name bv_shl} | "bvlshr" => const @{const_name bv_lshr} | "bvashr" => const @{const_name bv_ashr} +*) | "bvult" => const @{const_name less} | "bvule" => const @{const_name less_eq} | "bvugt" => const2_abs @{const_name less} diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/IsaMakefile --- a/src/HOL/IsaMakefile Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/IsaMakefile Wed May 12 23:54:04 2010 +0200 @@ -382,7 +382,8 @@ Tools/Qelim/ferrante_rackoff_data.ML \ Tools/Qelim/ferrante_rackoff.ML \ Tools/Qelim/langford_data.ML \ - Tools/Qelim/langford.ML + Tools/Qelim/langford.ML \ + Tools/SMT/smt_real.ML $(OUT)/HOL: ROOT.ML $(HOL_DEPENDENCIES) @$(ISABELLE_TOOL) usedir -b -g true $(OUT)/Pure HOL @@ -1191,7 +1192,7 @@ Word/BinBoolList.thy Word/BitSyntax.thy Word/WordDefinition.thy \ Word/WordArith.thy Word/WordBitwise.thy Word/WordShift.thy \ Word/WordGenLib.thy Word/Word.thy Word/document/root.tex \ - Word/document/root.bib + Word/document/root.bib Tools/SMT/smt_word.ML @cd Word; $(ISABELLE_TOOL) usedir -b -g true $(OUT)/HOL HOL-Word @@ -1255,21 +1256,23 @@ ## HOL-SMT_Examples -HOL-SMT_Examples: HOL $(LOG)/HOL-SMT_Examples.gz +HOL-SMT_Examples: HOL-Word $(LOG)/HOL-SMT_Examples.gz $(LOG)/HOL-SMT_Examples.gz: $(OUT)/HOL-SMT SMT_Examples/ROOT.ML \ - SMT_Examples/SMT_Examples.thy SMT_Examples/SMT_Examples.certs - @cd SMT; $(ISABELLE_TOOL) usedir $(OUT)/HOL Examples + SMT_Examples/SMT_Examples.thy SMT_Examples/SMT_Examples.certs \ + SMT_Examples/SMT_Word_Examples.thy SMT_Examples/SMT_Tests.thy \ + SMT_Examples/SMT_Word_Examples.certs SMT_Examples/SMT_Tests.certs + @$(ISABELLE_TOOL) usedir $(OUT)/HOL-Word SMT_Examples ## HOL-Boogie -HOL-Boogie: HOL $(OUT)/HOL-Boogie +HOL-Boogie: HOL-Word $(OUT)/HOL-Boogie $(OUT)/HOL-Boogie: $(OUT)/HOL Boogie/ROOT.ML Boogie/Boogie.thy \ Boogie/Tools/boogie_vcs.ML Boogie/Tools/boogie_loader.ML \ Boogie/Tools/boogie_commands.ML Boogie/Tools/boogie_tactics.ML - @cd Boogie; $(ISABELLE_TOOL) usedir -b -g true $(OUT)/HOL HOL-Boogie + @cd Boogie; $(ISABELLE_TOOL) usedir -b -g true $(OUT)/HOL-Word HOL-Boogie ## HOL-Boogie_Examples diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Main.thy --- a/src/HOL/Main.thy Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Main.thy Wed May 12 23:54:04 2010 +0200 @@ -1,7 +1,7 @@ header {* Main HOL *} theory Main -imports Plain Predicate_Compile Nitpick +imports Plain Predicate_Compile Nitpick SMT begin text {* diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Multivariate_Analysis/Integration.cert --- a/src/HOL/Multivariate_Analysis/Integration.cert Wed May 12 23:54:02 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3981 +0,0 @@ -9d0325fd923020e9d1f3e7c851ac5a92d68bdbdf 428 0 -#2 := false -decl uf_10 :: T1 -#38 := uf_10 -decl uf_3 :: T1 -#21 := uf_3 -#45 := (= uf_3 uf_10) -decl uf_1 :: (-> int T1) -decl uf_2 :: (-> T1 int) -#39 := (uf_2 uf_10) -#588 := (uf_1 #39) -#686 := (= #588 uf_10) -#589 := (= uf_10 #588) -#4 := (:var 0 T1) -#5 := (uf_2 #4) -#541 := (pattern #5) -#6 := (uf_1 #5) -#93 := (= #4 #6) -#542 := (forall (vars (?x1 T1)) (:pat #541) #93) -#96 := (forall (vars (?x1 T1)) #93) -#545 := (iff #96 #542) -#543 := (iff #93 #93) -#544 := [refl]: #543 -#546 := [quant-intro #544]: #545 -#454 := (~ #96 #96) -#456 := (~ #93 #93) -#457 := [refl]: #456 -#455 := [nnf-pos #457]: #454 -#7 := (= #6 #4) -#8 := (forall (vars (?x1 T1)) #7) -#97 := (iff #8 #96) -#94 := (iff #7 #93) -#95 := [rewrite]: #94 -#98 := [quant-intro #95]: #97 -#92 := [asserted]: #8 -#101 := [mp #92 #98]: #96 -#452 := [mp~ #101 #455]: #96 -#547 := [mp #452 #546]: #542 -#590 := (not #542) -#595 := (or #590 #589) -#596 := [quant-inst]: #595 -#680 := [unit-resolution #596 #547]: #589 -#687 := [symm #680]: #686 -#688 := (= uf_3 #588) -#22 := (uf_2 uf_3) -#586 := (uf_1 #22) -#684 := (= #586 #588) -#682 := (= #588 #586) -#678 := (= #39 #22) -#676 := (= #22 #39) -#9 := 0::int -#227 := -1::int -#230 := (* -1::int #39) -#231 := (+ #22 #230) -#296 := (<= #231 0::int) -#70 := (<= #22 #39) -#393 := (iff #70 #296) -#394 := [rewrite]: #393 -#347 := [asserted]: #70 -#395 := [mp #347 #394]: #296 -#229 := (>= #231 0::int) -decl uf_4 :: (-> T2 T3 real) -decl uf_6 :: (-> T1 T3) -#25 := (uf_6 uf_3) -decl uf_7 :: T2 -#27 := uf_7 -#28 := (uf_4 uf_7 #25) -decl uf_9 :: T2 -#33 := uf_9 -#34 := (uf_4 uf_9 #25) -#46 := (uf_6 uf_10) -decl uf_5 :: T2 -#24 := uf_5 -#47 := (uf_4 uf_5 #46) -#48 := (ite #45 #47 #34) -#256 := (ite #229 #48 #28) -#568 := (= #28 #256) -#648 := (not #568) -#194 := 0::real -#192 := -1::real -#265 := (* -1::real #256) -#640 := (+ #28 #265) -#642 := (>= #640 0::real) -#645 := (not #642) -#643 := [hypothesis]: #642 -decl uf_8 :: T2 -#30 := uf_8 -#31 := (uf_4 uf_8 #25) -#266 := (+ #31 #265) -#264 := (>= #266 0::real) -#267 := (not #264) -#26 := (uf_4 uf_5 #25) -decl uf_11 :: T2 -#41 := uf_11 -#42 := (uf_4 uf_11 #25) -#237 := (ite #229 #42 #26) -#245 := (* -1::real #237) -#246 := (+ #31 #245) -#247 := (<= #246 0::real) -#248 := (not #247) -#272 := (and #248 #267) -#40 := (< #22 #39) -#49 := (ite #40 #28 #48) -#50 := (< #31 #49) -#43 := (ite #40 #26 #42) -#44 := (< #43 #31) -#51 := (and #44 #50) -#273 := (iff #51 #272) -#270 := (iff #50 #267) -#261 := (< #31 #256) -#268 := (iff #261 #267) -#269 := [rewrite]: #268 -#262 := (iff #50 #261) -#259 := (= #49 #256) -#228 := (not #229) -#253 := (ite #228 #28 #48) -#257 := (= #253 #256) -#258 := [rewrite]: #257 -#254 := (= #49 #253) -#232 := (iff #40 #228) -#233 := [rewrite]: #232 -#255 := [monotonicity #233]: #254 -#260 := [trans #255 #258]: #259 -#263 := [monotonicity #260]: #262 -#271 := [trans #263 #269]: #270 -#251 := (iff #44 #248) -#242 := (< #237 #31) -#249 := (iff #242 #248) -#250 := [rewrite]: #249 -#243 := (iff #44 #242) -#240 := (= #43 #237) -#234 := (ite #228 #26 #42) -#238 := (= #234 #237) -#239 := [rewrite]: #238 -#235 := (= #43 #234) -#236 := [monotonicity #233]: #235 -#241 := [trans #236 #239]: #240 -#244 := [monotonicity #241]: #243 -#252 := [trans #244 #250]: #251 -#274 := [monotonicity #252 #271]: #273 -#178 := [asserted]: #51 -#275 := [mp #178 #274]: #272 -#277 := [and-elim #275]: #267 -#196 := (* -1::real #31) -#197 := (+ #28 #196) -#195 := (>= #197 0::real) -#193 := (not #195) -#213 := (* -1::real #34) -#214 := (+ #31 #213) -#212 := (>= #214 0::real) -#215 := (not #212) -#220 := (and #193 #215) -#23 := (< #22 #22) -#35 := (ite #23 #28 #34) -#36 := (< #31 #35) -#29 := (ite #23 #26 #28) -#32 := (< #29 #31) -#37 := (and #32 #36) -#221 := (iff #37 #220) -#218 := (iff #36 #215) -#209 := (< #31 #34) -#216 := (iff #209 #215) -#217 := [rewrite]: #216 -#210 := (iff #36 #209) -#207 := (= #35 #34) -#202 := (ite false #28 #34) -#205 := (= #202 #34) -#206 := [rewrite]: #205 -#203 := (= #35 #202) -#180 := (iff #23 false) -#181 := [rewrite]: #180 -#204 := [monotonicity #181]: #203 -#208 := [trans #204 #206]: #207 -#211 := [monotonicity #208]: #210 -#219 := [trans #211 #217]: #218 -#200 := (iff #32 #193) -#189 := (< #28 #31) -#198 := (iff #189 #193) -#199 := [rewrite]: #198 -#190 := (iff #32 #189) -#187 := (= #29 #28) -#182 := (ite false #26 #28) -#185 := (= #182 #28) -#186 := [rewrite]: #185 -#183 := (= #29 #182) -#184 := [monotonicity #181]: #183 -#188 := [trans #184 #186]: #187 -#191 := [monotonicity #188]: #190 -#201 := [trans #191 #199]: #200 -#222 := [monotonicity #201 #219]: #221 -#177 := [asserted]: #37 -#223 := [mp #177 #222]: #220 -#224 := [and-elim #223]: #193 -#644 := [th-lemma #224 #277 #643]: false -#646 := [lemma #644]: #645 -#647 := [hypothesis]: #568 -#649 := (or #648 #642) -#650 := [th-lemma]: #649 -#651 := [unit-resolution #650 #647 #646]: false -#652 := [lemma #651]: #648 -#578 := (or #229 #568) -#579 := [def-axiom]: #578 -#675 := [unit-resolution #579 #652]: #229 -#677 := [th-lemma #675 #395]: #676 -#679 := [symm #677]: #678 -#683 := [monotonicity #679]: #682 -#685 := [symm #683]: #684 -#587 := (= uf_3 #586) -#591 := (or #590 #587) -#592 := [quant-inst]: #591 -#681 := [unit-resolution #592 #547]: #587 -#689 := [trans #681 #685]: #688 -#690 := [trans #689 #687]: #45 -#571 := (not #45) -#54 := (uf_4 uf_11 #46) -#279 := (ite #45 #28 #54) -#465 := (* -1::real #279) -#632 := (+ #28 #465) -#633 := (<= #632 0::real) -#580 := (= #28 #279) -#656 := [hypothesis]: #45 -#582 := (or #571 #580) -#583 := [def-axiom]: #582 -#657 := [unit-resolution #583 #656]: #580 -#658 := (not #580) -#659 := (or #658 #633) -#660 := [th-lemma]: #659 -#661 := [unit-resolution #660 #657]: #633 -#57 := (uf_4 uf_8 #46) -#363 := (* -1::real #57) -#379 := (+ #47 #363) -#380 := (<= #379 0::real) -#381 := (not #380) -#364 := (+ #54 #363) -#362 := (>= #364 0::real) -#361 := (not #362) -#386 := (and #361 #381) -#59 := (uf_4 uf_7 #46) -#64 := (< #39 #39) -#67 := (ite #64 #59 #47) -#68 := (< #57 #67) -#65 := (ite #64 #47 #54) -#66 := (< #65 #57) -#69 := (and #66 #68) -#387 := (iff #69 #386) -#384 := (iff #68 #381) -#376 := (< #57 #47) -#382 := (iff #376 #381) -#383 := [rewrite]: #382 -#377 := (iff #68 #376) -#374 := (= #67 #47) -#369 := (ite false #59 #47) -#372 := (= #369 #47) -#373 := [rewrite]: #372 -#370 := (= #67 #369) -#349 := (iff #64 false) -#350 := [rewrite]: #349 -#371 := [monotonicity #350]: #370 -#375 := [trans #371 #373]: #374 -#378 := [monotonicity #375]: #377 -#385 := [trans #378 #383]: #384 -#367 := (iff #66 #361) -#358 := (< #54 #57) -#365 := (iff #358 #361) -#366 := [rewrite]: #365 -#359 := (iff #66 #358) -#356 := (= #65 #54) -#351 := (ite false #47 #54) -#354 := (= #351 #54) -#355 := [rewrite]: #354 -#352 := (= #65 #351) -#353 := [monotonicity #350]: #352 -#357 := [trans #353 #355]: #356 -#360 := [monotonicity #357]: #359 -#368 := [trans #360 #366]: #367 -#388 := [monotonicity #368 #385]: #387 -#346 := [asserted]: #69 -#389 := [mp #346 #388]: #386 -#391 := [and-elim #389]: #381 -#397 := (* -1::real #59) -#398 := (+ #47 #397) -#399 := (<= #398 0::real) -#409 := (* -1::real #54) -#410 := (+ #47 #409) -#408 := (>= #410 0::real) -#60 := (uf_4 uf_9 #46) -#402 := (* -1::real #60) -#403 := (+ #59 #402) -#404 := (<= #403 0::real) -#418 := (and #399 #404 #408) -#73 := (<= #59 #60) -#72 := (<= #47 #59) -#74 := (and #72 #73) -#71 := (<= #54 #47) -#75 := (and #71 #74) -#421 := (iff #75 #418) -#412 := (and #399 #404) -#415 := (and #408 #412) -#419 := (iff #415 #418) -#420 := [rewrite]: #419 -#416 := (iff #75 #415) -#413 := (iff #74 #412) -#405 := (iff #73 #404) -#406 := [rewrite]: #405 -#400 := (iff #72 #399) -#401 := [rewrite]: #400 -#414 := [monotonicity #401 #406]: #413 -#407 := (iff #71 #408) -#411 := [rewrite]: #407 -#417 := [monotonicity #411 #414]: #416 -#422 := [trans #417 #420]: #421 -#348 := [asserted]: #75 -#423 := [mp #348 #422]: #418 -#424 := [and-elim #423]: #399 -#637 := (+ #28 #397) -#639 := (>= #637 0::real) -#636 := (= #28 #59) -#666 := (= #59 #28) -#664 := (= #46 #25) -#662 := (= #25 #46) -#663 := [monotonicity #656]: #662 -#665 := [symm #663]: #664 -#667 := [monotonicity #665]: #666 -#668 := [symm #667]: #636 -#669 := (not #636) -#670 := (or #669 #639) -#671 := [th-lemma]: #670 -#672 := [unit-resolution #671 #668]: #639 -#468 := (+ #57 #465) -#471 := (<= #468 0::real) -#444 := (not #471) -#322 := (ite #296 #279 #47) -#330 := (* -1::real #322) -#331 := (+ #57 #330) -#332 := (<= #331 0::real) -#333 := (not #332) -#445 := (iff #333 #444) -#472 := (iff #332 #471) -#469 := (= #331 #468) -#466 := (= #330 #465) -#463 := (= #322 #279) -#1 := true -#458 := (ite true #279 #47) -#461 := (= #458 #279) -#462 := [rewrite]: #461 -#459 := (= #322 #458) -#450 := (iff #296 true) -#451 := [iff-true #395]: #450 -#460 := [monotonicity #451]: #459 -#464 := [trans #460 #462]: #463 -#467 := [monotonicity #464]: #466 -#470 := [monotonicity #467]: #469 -#473 := [monotonicity #470]: #472 -#474 := [monotonicity #473]: #445 -#303 := (ite #296 #60 #59) -#313 := (* -1::real #303) -#314 := (+ #57 #313) -#312 := (>= #314 0::real) -#311 := (not #312) -#338 := (and #311 #333) -#52 := (< #39 #22) -#61 := (ite #52 #59 #60) -#62 := (< #57 #61) -#53 := (= uf_10 uf_3) -#55 := (ite #53 #28 #54) -#56 := (ite #52 #47 #55) -#58 := (< #56 #57) -#63 := (and #58 #62) -#341 := (iff #63 #338) -#282 := (ite #52 #47 #279) -#285 := (< #282 #57) -#291 := (and #62 #285) -#339 := (iff #291 #338) -#336 := (iff #285 #333) -#327 := (< #322 #57) -#334 := (iff #327 #333) -#335 := [rewrite]: #334 -#328 := (iff #285 #327) -#325 := (= #282 #322) -#297 := (not #296) -#319 := (ite #297 #47 #279) -#323 := (= #319 #322) -#324 := [rewrite]: #323 -#320 := (= #282 #319) -#298 := (iff #52 #297) -#299 := [rewrite]: #298 -#321 := [monotonicity #299]: #320 -#326 := [trans #321 #324]: #325 -#329 := [monotonicity #326]: #328 -#337 := [trans #329 #335]: #336 -#317 := (iff #62 #311) -#308 := (< #57 #303) -#315 := (iff #308 #311) -#316 := [rewrite]: #315 -#309 := (iff #62 #308) -#306 := (= #61 #303) -#300 := (ite #297 #59 #60) -#304 := (= #300 #303) -#305 := [rewrite]: #304 -#301 := (= #61 #300) -#302 := [monotonicity #299]: #301 -#307 := [trans #302 #305]: #306 -#310 := [monotonicity #307]: #309 -#318 := [trans #310 #316]: #317 -#340 := [monotonicity #318 #337]: #339 -#294 := (iff #63 #291) -#288 := (and #285 #62) -#292 := (iff #288 #291) -#293 := [rewrite]: #292 -#289 := (iff #63 #288) -#286 := (iff #58 #285) -#283 := (= #56 #282) -#280 := (= #55 #279) -#226 := (iff #53 #45) -#278 := [rewrite]: #226 -#281 := [monotonicity #278]: #280 -#284 := [monotonicity #281]: #283 -#287 := [monotonicity #284]: #286 -#290 := [monotonicity #287]: #289 -#295 := [trans #290 #293]: #294 -#342 := [trans #295 #340]: #341 -#179 := [asserted]: #63 -#343 := [mp #179 #342]: #338 -#345 := [and-elim #343]: #333 -#475 := [mp #345 #474]: #444 -#673 := [th-lemma #475 #672 #424 #391 #661]: false -#674 := [lemma #673]: #571 -[unit-resolution #674 #690]: false -unsat -c87f23eea66c69622dc5ab167ea6f34f69f5b963 419 0 -#2 := false -#194 := 0::real -decl uf_4 :: (-> T2 T3 real) -decl uf_6 :: (-> T1 T3) -decl uf_3 :: T1 -#21 := uf_3 -#25 := (uf_6 uf_3) -decl uf_5 :: T2 -#24 := uf_5 -#26 := (uf_4 uf_5 #25) -decl uf_7 :: T2 -#27 := uf_7 -#28 := (uf_4 uf_7 #25) -decl uf_10 :: T1 -#38 := uf_10 -#42 := (uf_6 uf_10) -decl uf_9 :: T2 -#33 := uf_9 -#43 := (uf_4 uf_9 #42) -#41 := (= uf_3 uf_10) -#44 := (ite #41 #43 #28) -#9 := 0::int -decl uf_2 :: (-> T1 int) -#39 := (uf_2 uf_10) -#226 := -1::int -#229 := (* -1::int #39) -#22 := (uf_2 uf_3) -#230 := (+ #22 #229) -#228 := (>= #230 0::int) -#236 := (ite #228 #44 #26) -#192 := -1::real -#244 := (* -1::real #236) -#642 := (+ #26 #244) -#643 := (<= #642 0::real) -#567 := (= #26 #236) -#227 := (not #228) -decl uf_1 :: (-> int T1) -#593 := (uf_1 #39) -#660 := (= #593 uf_10) -#594 := (= uf_10 #593) -#4 := (:var 0 T1) -#5 := (uf_2 #4) -#546 := (pattern #5) -#6 := (uf_1 #5) -#93 := (= #4 #6) -#547 := (forall (vars (?x1 T1)) (:pat #546) #93) -#96 := (forall (vars (?x1 T1)) #93) -#550 := (iff #96 #547) -#548 := (iff #93 #93) -#549 := [refl]: #548 -#551 := [quant-intro #549]: #550 -#448 := (~ #96 #96) -#450 := (~ #93 #93) -#451 := [refl]: #450 -#449 := [nnf-pos #451]: #448 -#7 := (= #6 #4) -#8 := (forall (vars (?x1 T1)) #7) -#97 := (iff #8 #96) -#94 := (iff #7 #93) -#95 := [rewrite]: #94 -#98 := [quant-intro #95]: #97 -#92 := [asserted]: #8 -#101 := [mp #92 #98]: #96 -#446 := [mp~ #101 #449]: #96 -#552 := [mp #446 #551]: #547 -#595 := (not #547) -#600 := (or #595 #594) -#601 := [quant-inst]: #600 -#654 := [unit-resolution #601 #552]: #594 -#680 := [symm #654]: #660 -#681 := (= uf_3 #593) -#591 := (uf_1 #22) -#658 := (= #591 #593) -#656 := (= #593 #591) -#652 := (= #39 #22) -#647 := (= #22 #39) -#290 := (<= #230 0::int) -#70 := (<= #22 #39) -#388 := (iff #70 #290) -#389 := [rewrite]: #388 -#341 := [asserted]: #70 -#390 := [mp #341 #389]: #290 -#646 := [hypothesis]: #228 -#648 := [th-lemma #646 #390]: #647 -#653 := [symm #648]: #652 -#657 := [monotonicity #653]: #656 -#659 := [symm #657]: #658 -#592 := (= uf_3 #591) -#596 := (or #595 #592) -#597 := [quant-inst]: #596 -#655 := [unit-resolution #597 #552]: #592 -#682 := [trans #655 #659]: #681 -#683 := [trans #682 #680]: #41 -#570 := (not #41) -decl uf_11 :: T2 -#47 := uf_11 -#59 := (uf_4 uf_11 #42) -#278 := (ite #41 #26 #59) -#459 := (* -1::real #278) -#637 := (+ #26 #459) -#639 := (>= #637 0::real) -#585 := (= #26 #278) -#661 := [hypothesis]: #41 -#587 := (or #570 #585) -#588 := [def-axiom]: #587 -#662 := [unit-resolution #588 #661]: #585 -#663 := (not #585) -#664 := (or #663 #639) -#665 := [th-lemma]: #664 -#666 := [unit-resolution #665 #662]: #639 -decl uf_8 :: T2 -#30 := uf_8 -#56 := (uf_4 uf_8 #42) -#357 := (* -1::real #56) -#358 := (+ #43 #357) -#356 := (>= #358 0::real) -#355 := (not #356) -#374 := (* -1::real #59) -#375 := (+ #56 #374) -#373 := (>= #375 0::real) -#376 := (not #373) -#381 := (and #355 #376) -#64 := (< #39 #39) -#67 := (ite #64 #43 #59) -#68 := (< #56 #67) -#53 := (uf_4 uf_5 #42) -#65 := (ite #64 #53 #43) -#66 := (< #65 #56) -#69 := (and #66 #68) -#382 := (iff #69 #381) -#379 := (iff #68 #376) -#370 := (< #56 #59) -#377 := (iff #370 #376) -#378 := [rewrite]: #377 -#371 := (iff #68 #370) -#368 := (= #67 #59) -#363 := (ite false #43 #59) -#366 := (= #363 #59) -#367 := [rewrite]: #366 -#364 := (= #67 #363) -#343 := (iff #64 false) -#344 := [rewrite]: #343 -#365 := [monotonicity #344]: #364 -#369 := [trans #365 #367]: #368 -#372 := [monotonicity #369]: #371 -#380 := [trans #372 #378]: #379 -#361 := (iff #66 #355) -#352 := (< #43 #56) -#359 := (iff #352 #355) -#360 := [rewrite]: #359 -#353 := (iff #66 #352) -#350 := (= #65 #43) -#345 := (ite false #53 #43) -#348 := (= #345 #43) -#349 := [rewrite]: #348 -#346 := (= #65 #345) -#347 := [monotonicity #344]: #346 -#351 := [trans #347 #349]: #350 -#354 := [monotonicity #351]: #353 -#362 := [trans #354 #360]: #361 -#383 := [monotonicity #362 #380]: #382 -#340 := [asserted]: #69 -#384 := [mp #340 #383]: #381 -#385 := [and-elim #384]: #355 -#394 := (* -1::real #53) -#395 := (+ #43 #394) -#393 := (>= #395 0::real) -#54 := (uf_4 uf_7 #42) -#402 := (* -1::real #54) -#403 := (+ #53 #402) -#401 := (>= #403 0::real) -#397 := (+ #43 #374) -#398 := (<= #397 0::real) -#412 := (and #393 #398 #401) -#73 := (<= #43 #59) -#72 := (<= #53 #43) -#74 := (and #72 #73) -#71 := (<= #54 #53) -#75 := (and #71 #74) -#415 := (iff #75 #412) -#406 := (and #393 #398) -#409 := (and #401 #406) -#413 := (iff #409 #412) -#414 := [rewrite]: #413 -#410 := (iff #75 #409) -#407 := (iff #74 #406) -#399 := (iff #73 #398) -#400 := [rewrite]: #399 -#392 := (iff #72 #393) -#396 := [rewrite]: #392 -#408 := [monotonicity #396 #400]: #407 -#404 := (iff #71 #401) -#405 := [rewrite]: #404 -#411 := [monotonicity #405 #408]: #410 -#416 := [trans #411 #414]: #415 -#342 := [asserted]: #75 -#417 := [mp #342 #416]: #412 -#418 := [and-elim #417]: #393 -#650 := (+ #26 #394) -#651 := (<= #650 0::real) -#649 := (= #26 #53) -#671 := (= #53 #26) -#669 := (= #42 #25) -#667 := (= #25 #42) -#668 := [monotonicity #661]: #667 -#670 := [symm #668]: #669 -#672 := [monotonicity #670]: #671 -#673 := [symm #672]: #649 -#674 := (not #649) -#675 := (or #674 #651) -#676 := [th-lemma]: #675 -#677 := [unit-resolution #676 #673]: #651 -#462 := (+ #56 #459) -#465 := (>= #462 0::real) -#438 := (not #465) -#316 := (ite #290 #278 #43) -#326 := (* -1::real #316) -#327 := (+ #56 #326) -#325 := (>= #327 0::real) -#324 := (not #325) -#439 := (iff #324 #438) -#466 := (iff #325 #465) -#463 := (= #327 #462) -#460 := (= #326 #459) -#457 := (= #316 #278) -#1 := true -#452 := (ite true #278 #43) -#455 := (= #452 #278) -#456 := [rewrite]: #455 -#453 := (= #316 #452) -#444 := (iff #290 true) -#445 := [iff-true #390]: #444 -#454 := [monotonicity #445]: #453 -#458 := [trans #454 #456]: #457 -#461 := [monotonicity #458]: #460 -#464 := [monotonicity #461]: #463 -#467 := [monotonicity #464]: #466 -#468 := [monotonicity #467]: #439 -#297 := (ite #290 #54 #53) -#305 := (* -1::real #297) -#306 := (+ #56 #305) -#307 := (<= #306 0::real) -#308 := (not #307) -#332 := (and #308 #324) -#58 := (= uf_10 uf_3) -#60 := (ite #58 #26 #59) -#52 := (< #39 #22) -#61 := (ite #52 #43 #60) -#62 := (< #56 #61) -#55 := (ite #52 #53 #54) -#57 := (< #55 #56) -#63 := (and #57 #62) -#335 := (iff #63 #332) -#281 := (ite #52 #43 #278) -#284 := (< #56 #281) -#287 := (and #57 #284) -#333 := (iff #287 #332) -#330 := (iff #284 #324) -#321 := (< #56 #316) -#328 := (iff #321 #324) -#329 := [rewrite]: #328 -#322 := (iff #284 #321) -#319 := (= #281 #316) -#291 := (not #290) -#313 := (ite #291 #43 #278) -#317 := (= #313 #316) -#318 := [rewrite]: #317 -#314 := (= #281 #313) -#292 := (iff #52 #291) -#293 := [rewrite]: #292 -#315 := [monotonicity #293]: #314 -#320 := [trans #315 #318]: #319 -#323 := [monotonicity #320]: #322 -#331 := [trans #323 #329]: #330 -#311 := (iff #57 #308) -#302 := (< #297 #56) -#309 := (iff #302 #308) -#310 := [rewrite]: #309 -#303 := (iff #57 #302) -#300 := (= #55 #297) -#294 := (ite #291 #53 #54) -#298 := (= #294 #297) -#299 := [rewrite]: #298 -#295 := (= #55 #294) -#296 := [monotonicity #293]: #295 -#301 := [trans #296 #299]: #300 -#304 := [monotonicity #301]: #303 -#312 := [trans #304 #310]: #311 -#334 := [monotonicity #312 #331]: #333 -#288 := (iff #63 #287) -#285 := (iff #62 #284) -#282 := (= #61 #281) -#279 := (= #60 #278) -#225 := (iff #58 #41) -#277 := [rewrite]: #225 -#280 := [monotonicity #277]: #279 -#283 := [monotonicity #280]: #282 -#286 := [monotonicity #283]: #285 -#289 := [monotonicity #286]: #288 -#336 := [trans #289 #334]: #335 -#179 := [asserted]: #63 -#337 := [mp #179 #336]: #332 -#339 := [and-elim #337]: #324 -#469 := [mp #339 #468]: #438 -#678 := [th-lemma #469 #677 #418 #385 #666]: false -#679 := [lemma #678]: #570 -#684 := [unit-resolution #679 #683]: false -#685 := [lemma #684]: #227 -#577 := (or #228 #567) -#578 := [def-axiom]: #577 -#645 := [unit-resolution #578 #685]: #567 -#686 := (not #567) -#687 := (or #686 #643) -#688 := [th-lemma]: #687 -#689 := [unit-resolution #688 #645]: #643 -#31 := (uf_4 uf_8 #25) -#245 := (+ #31 #244) -#246 := (<= #245 0::real) -#247 := (not #246) -#34 := (uf_4 uf_9 #25) -#48 := (uf_4 uf_11 #25) -#255 := (ite #228 #48 #34) -#264 := (* -1::real #255) -#265 := (+ #31 #264) -#263 := (>= #265 0::real) -#266 := (not #263) -#271 := (and #247 #266) -#40 := (< #22 #39) -#49 := (ite #40 #34 #48) -#50 := (< #31 #49) -#45 := (ite #40 #26 #44) -#46 := (< #45 #31) -#51 := (and #46 #50) -#272 := (iff #51 #271) -#269 := (iff #50 #266) -#260 := (< #31 #255) -#267 := (iff #260 #266) -#268 := [rewrite]: #267 -#261 := (iff #50 #260) -#258 := (= #49 #255) -#252 := (ite #227 #34 #48) -#256 := (= #252 #255) -#257 := [rewrite]: #256 -#253 := (= #49 #252) -#231 := (iff #40 #227) -#232 := [rewrite]: #231 -#254 := [monotonicity #232]: #253 -#259 := [trans #254 #257]: #258 -#262 := [monotonicity #259]: #261 -#270 := [trans #262 #268]: #269 -#250 := (iff #46 #247) -#241 := (< #236 #31) -#248 := (iff #241 #247) -#249 := [rewrite]: #248 -#242 := (iff #46 #241) -#239 := (= #45 #236) -#233 := (ite #227 #26 #44) -#237 := (= #233 #236) -#238 := [rewrite]: #237 -#234 := (= #45 #233) -#235 := [monotonicity #232]: #234 -#240 := [trans #235 #238]: #239 -#243 := [monotonicity #240]: #242 -#251 := [trans #243 #249]: #250 -#273 := [monotonicity #251 #270]: #272 -#178 := [asserted]: #51 -#274 := [mp #178 #273]: #271 -#275 := [and-elim #274]: #247 -#196 := (* -1::real #31) -#212 := (+ #26 #196) -#213 := (<= #212 0::real) -#214 := (not #213) -#197 := (+ #28 #196) -#195 := (>= #197 0::real) -#193 := (not #195) -#219 := (and #193 #214) -#23 := (< #22 #22) -#35 := (ite #23 #34 #26) -#36 := (< #31 #35) -#29 := (ite #23 #26 #28) -#32 := (< #29 #31) -#37 := (and #32 #36) -#220 := (iff #37 #219) -#217 := (iff #36 #214) -#209 := (< #31 #26) -#215 := (iff #209 #214) -#216 := [rewrite]: #215 -#210 := (iff #36 #209) -#207 := (= #35 #26) -#202 := (ite false #34 #26) -#205 := (= #202 #26) -#206 := [rewrite]: #205 -#203 := (= #35 #202) -#180 := (iff #23 false) -#181 := [rewrite]: #180 -#204 := [monotonicity #181]: #203 -#208 := [trans #204 #206]: #207 -#211 := [monotonicity #208]: #210 -#218 := [trans #211 #216]: #217 -#200 := (iff #32 #193) -#189 := (< #28 #31) -#198 := (iff #189 #193) -#199 := [rewrite]: #198 -#190 := (iff #32 #189) -#187 := (= #29 #28) -#182 := (ite false #26 #28) -#185 := (= #182 #28) -#186 := [rewrite]: #185 -#183 := (= #29 #182) -#184 := [monotonicity #181]: #183 -#188 := [trans #184 #186]: #187 -#191 := [monotonicity #188]: #190 -#201 := [trans #191 #199]: #200 -#221 := [monotonicity #201 #218]: #220 -#177 := [asserted]: #37 -#222 := [mp #177 #221]: #219 -#224 := [and-elim #222]: #214 -[th-lemma #224 #275 #689]: false -unsat -1596317f793892bf21292b98f5b9358a7fbbbc34 907 0 -#2 := false -#299 := 0::real -decl uf_1 :: (-> T3 T2 real) -decl uf_10 :: (-> T4 T2) -decl uf_7 :: T4 -#15 := uf_7 -#22 := (uf_10 uf_7) -decl uf_2 :: (-> T1 T3) -decl uf_4 :: T1 -#11 := uf_4 -#91 := (uf_2 uf_4) -#902 := (uf_1 #91 #22) -#297 := -1::real -#1084 := (* -1::real #902) -decl uf_16 :: T1 -#50 := uf_16 -#78 := (uf_2 uf_16) -#799 := (uf_1 #78 #22) -#1267 := (+ #799 #1084) -#1272 := (>= #1267 0::real) -#1266 := (= #799 #902) -decl uf_9 :: T3 -#21 := uf_9 -#23 := (uf_1 uf_9 #22) -#905 := (= #23 #902) -decl uf_11 :: T3 -#24 := uf_11 -#850 := (uf_1 uf_11 #22) -#904 := (= #850 #902) -decl uf_6 :: (-> T2 T4) -#74 := (uf_6 #22) -#281 := (= uf_7 #74) -#922 := (ite #281 #905 #904) -decl uf_8 :: T3 -#18 := uf_8 -#848 := (uf_1 uf_8 #22) -#903 := (= #848 #902) -#60 := 0::int -decl uf_5 :: (-> T4 int) -#803 := (uf_5 #74) -#117 := -1::int -#813 := (* -1::int #803) -#16 := (uf_5 uf_7) -#916 := (+ #16 #813) -#917 := (<= #916 0::int) -#925 := (ite #917 #922 #903) -#6 := (:var 0 T2) -#19 := (uf_1 uf_8 #6) -#544 := (pattern #19) -#25 := (uf_1 uf_11 #6) -#543 := (pattern #25) -#92 := (uf_1 #91 #6) -#542 := (pattern #92) -#13 := (uf_6 #6) -#541 := (pattern #13) -#447 := (= #19 #92) -#445 := (= #25 #92) -#444 := (= #23 #92) -#20 := (= #13 uf_7) -#446 := (ite #20 #444 #445) -#120 := (* -1::int #16) -#14 := (uf_5 #13) -#121 := (+ #14 #120) -#119 := (>= #121 0::int) -#448 := (ite #119 #446 #447) -#545 := (forall (vars (?x3 T2)) (:pat #541 #542 #543 #544) #448) -#451 := (forall (vars (?x3 T2)) #448) -#548 := (iff #451 #545) -#546 := (iff #448 #448) -#547 := [refl]: #546 -#549 := [quant-intro #547]: #548 -#26 := (ite #20 #23 #25) -#127 := (ite #119 #26 #19) -#368 := (= #92 #127) -#369 := (forall (vars (?x3 T2)) #368) -#452 := (iff #369 #451) -#449 := (iff #368 #448) -#450 := [rewrite]: #449 -#453 := [quant-intro #450]: #452 -#392 := (~ #369 #369) -#390 := (~ #368 #368) -#391 := [refl]: #390 -#366 := [nnf-pos #391]: #392 -decl uf_3 :: (-> T1 T2 real) -#12 := (uf_3 uf_4 #6) -#132 := (= #12 #127) -#135 := (forall (vars (?x3 T2)) #132) -#370 := (iff #135 #369) -#4 := (:var 1 T1) -#8 := (uf_3 #4 #6) -#5 := (uf_2 #4) -#7 := (uf_1 #5 #6) -#9 := (= #7 #8) -#10 := (forall (vars (?x1 T1) (?x2 T2)) #9) -#113 := [asserted]: #10 -#371 := [rewrite* #113]: #370 -#17 := (< #14 #16) -#27 := (ite #17 #19 #26) -#28 := (= #12 #27) -#29 := (forall (vars (?x3 T2)) #28) -#136 := (iff #29 #135) -#133 := (iff #28 #132) -#130 := (= #27 #127) -#118 := (not #119) -#124 := (ite #118 #19 #26) -#128 := (= #124 #127) -#129 := [rewrite]: #128 -#125 := (= #27 #124) -#122 := (iff #17 #118) -#123 := [rewrite]: #122 -#126 := [monotonicity #123]: #125 -#131 := [trans #126 #129]: #130 -#134 := [monotonicity #131]: #133 -#137 := [quant-intro #134]: #136 -#114 := [asserted]: #29 -#138 := [mp #114 #137]: #135 -#372 := [mp #138 #371]: #369 -#367 := [mp~ #372 #366]: #369 -#454 := [mp #367 #453]: #451 -#550 := [mp #454 #549]: #545 -#738 := (not #545) -#928 := (or #738 #925) -#75 := (= #74 uf_7) -#906 := (ite #75 #905 #904) -#907 := (+ #803 #120) -#908 := (>= #907 0::int) -#909 := (ite #908 #906 #903) -#929 := (or #738 #909) -#931 := (iff #929 #928) -#933 := (iff #928 #928) -#934 := [rewrite]: #933 -#926 := (iff #909 #925) -#923 := (iff #906 #922) -#283 := (iff #75 #281) -#284 := [rewrite]: #283 -#924 := [monotonicity #284]: #923 -#920 := (iff #908 #917) -#910 := (+ #120 #803) -#913 := (>= #910 0::int) -#918 := (iff #913 #917) -#919 := [rewrite]: #918 -#914 := (iff #908 #913) -#911 := (= #907 #910) -#912 := [rewrite]: #911 -#915 := [monotonicity #912]: #914 -#921 := [trans #915 #919]: #920 -#927 := [monotonicity #921 #924]: #926 -#932 := [monotonicity #927]: #931 -#935 := [trans #932 #934]: #931 -#930 := [quant-inst]: #929 -#936 := [mp #930 #935]: #928 -#1300 := [unit-resolution #936 #550]: #925 -#989 := (= #16 #803) -#1277 := (= #803 #16) -#280 := [asserted]: #75 -#287 := [mp #280 #284]: #281 -#1276 := [symm #287]: #75 -#1278 := [monotonicity #1276]: #1277 -#1301 := [symm #1278]: #989 -#1302 := (not #989) -#1303 := (or #1302 #917) -#1304 := [th-lemma]: #1303 -#1305 := [unit-resolution #1304 #1301]: #917 -#950 := (not #917) -#949 := (not #925) -#951 := (or #949 #950 #922) -#952 := [def-axiom]: #951 -#1306 := [unit-resolution #952 #1305 #1300]: #922 -#937 := (not #922) -#1307 := (or #937 #905) -#938 := (not #281) -#939 := (or #937 #938 #905) -#940 := [def-axiom]: #939 -#1308 := [unit-resolution #940 #287]: #1307 -#1309 := [unit-resolution #1308 #1306]: #905 -#1356 := (= #799 #23) -#800 := (= #23 #799) -decl uf_15 :: T4 -#40 := uf_15 -#41 := (uf_5 uf_15) -#814 := (+ #41 #813) -#815 := (<= #814 0::int) -#836 := (not #815) -#158 := (* -1::int #41) -#1270 := (+ #16 #158) -#1265 := (>= #1270 0::int) -#1339 := (not #1265) -#1269 := (= #16 #41) -#1298 := (not #1269) -#286 := (= uf_7 uf_15) -#44 := (uf_10 uf_15) -#72 := (uf_6 #44) -#73 := (= #72 uf_15) -#277 := (= uf_15 #72) -#278 := (iff #73 #277) -#279 := [rewrite]: #278 -#276 := [asserted]: #73 -#282 := [mp #276 #279]: #277 -#1274 := [symm #282]: #73 -#729 := (= uf_7 #72) -decl uf_17 :: (-> int T4) -#611 := (uf_5 #72) -#991 := (uf_17 #611) -#1289 := (= #991 #72) -#992 := (= #72 #991) -#55 := (:var 0 T4) -#56 := (uf_5 #55) -#574 := (pattern #56) -#57 := (uf_17 #56) -#177 := (= #55 #57) -#575 := (forall (vars (?x7 T4)) (:pat #574) #177) -#195 := (forall (vars (?x7 T4)) #177) -#578 := (iff #195 #575) -#576 := (iff #177 #177) -#577 := [refl]: #576 -#579 := [quant-intro #577]: #578 -#405 := (~ #195 #195) -#403 := (~ #177 #177) -#404 := [refl]: #403 -#406 := [nnf-pos #404]: #405 -#58 := (= #57 #55) -#59 := (forall (vars (?x7 T4)) #58) -#196 := (iff #59 #195) -#193 := (iff #58 #177) -#194 := [rewrite]: #193 -#197 := [quant-intro #194]: #196 -#155 := [asserted]: #59 -#200 := [mp #155 #197]: #195 -#407 := [mp~ #200 #406]: #195 -#580 := [mp #407 #579]: #575 -#995 := (not #575) -#996 := (or #995 #992) -#997 := [quant-inst]: #996 -#1273 := [unit-resolution #997 #580]: #992 -#1290 := [symm #1273]: #1289 -#1293 := (= uf_7 #991) -#993 := (uf_17 #803) -#1287 := (= #993 #991) -#1284 := (= #803 #611) -#987 := (= #41 #611) -#1279 := (= #611 #41) -#1280 := [monotonicity #1274]: #1279 -#1281 := [symm #1280]: #987 -#1282 := (= #803 #41) -#1275 := [hypothesis]: #1269 -#1283 := [trans #1278 #1275]: #1282 -#1285 := [trans #1283 #1281]: #1284 -#1288 := [monotonicity #1285]: #1287 -#1291 := (= uf_7 #993) -#994 := (= #74 #993) -#1000 := (or #995 #994) -#1001 := [quant-inst]: #1000 -#1286 := [unit-resolution #1001 #580]: #994 -#1292 := [trans #287 #1286]: #1291 -#1294 := [trans #1292 #1288]: #1293 -#1295 := [trans #1294 #1290]: #729 -#1296 := [trans #1295 #1274]: #286 -#290 := (not #286) -#76 := (= uf_15 uf_7) -#77 := (not #76) -#291 := (iff #77 #290) -#288 := (iff #76 #286) -#289 := [rewrite]: #288 -#292 := [monotonicity #289]: #291 -#285 := [asserted]: #77 -#295 := [mp #285 #292]: #290 -#1297 := [unit-resolution #295 #1296]: false -#1299 := [lemma #1297]: #1298 -#1342 := (or #1269 #1339) -#1271 := (<= #1270 0::int) -#621 := (* -1::int #611) -#723 := (+ #16 #621) -#724 := (<= #723 0::int) -decl uf_12 :: T1 -#30 := uf_12 -#88 := (uf_2 uf_12) -#771 := (uf_1 #88 #44) -#45 := (uf_1 uf_9 #44) -#772 := (= #45 #771) -#796 := (not #772) -decl uf_14 :: T1 -#38 := uf_14 -#83 := (uf_2 uf_14) -#656 := (uf_1 #83 #44) -#1239 := (= #656 #771) -#1252 := (not #1239) -#1324 := (iff #1252 #796) -#1322 := (iff #1239 #772) -#1320 := (= #656 #45) -#661 := (= #45 #656) -#659 := (uf_1 uf_11 #44) -#664 := (= #656 #659) -#667 := (ite #277 #661 #664) -#657 := (uf_1 uf_8 #44) -#670 := (= #656 #657) -#622 := (+ #41 #621) -#623 := (<= #622 0::int) -#673 := (ite #623 #667 #670) -#84 := (uf_1 #83 #6) -#560 := (pattern #84) -#467 := (= #19 #84) -#465 := (= #25 #84) -#464 := (= #45 #84) -#43 := (= #13 uf_15) -#466 := (ite #43 #464 #465) -#159 := (+ #14 #158) -#157 := (>= #159 0::int) -#468 := (ite #157 #466 #467) -#561 := (forall (vars (?x5 T2)) (:pat #541 #560 #543 #544) #468) -#471 := (forall (vars (?x5 T2)) #468) -#564 := (iff #471 #561) -#562 := (iff #468 #468) -#563 := [refl]: #562 -#565 := [quant-intro #563]: #564 -#46 := (ite #43 #45 #25) -#165 := (ite #157 #46 #19) -#378 := (= #84 #165) -#379 := (forall (vars (?x5 T2)) #378) -#472 := (iff #379 #471) -#469 := (iff #378 #468) -#470 := [rewrite]: #469 -#473 := [quant-intro #470]: #472 -#359 := (~ #379 #379) -#361 := (~ #378 #378) -#358 := [refl]: #361 -#356 := [nnf-pos #358]: #359 -#39 := (uf_3 uf_14 #6) -#170 := (= #39 #165) -#173 := (forall (vars (?x5 T2)) #170) -#380 := (iff #173 #379) -#381 := [rewrite* #113]: #380 -#42 := (< #14 #41) -#47 := (ite #42 #19 #46) -#48 := (= #39 #47) -#49 := (forall (vars (?x5 T2)) #48) -#174 := (iff #49 #173) -#171 := (iff #48 #170) -#168 := (= #47 #165) -#156 := (not #157) -#162 := (ite #156 #19 #46) -#166 := (= #162 #165) -#167 := [rewrite]: #166 -#163 := (= #47 #162) -#160 := (iff #42 #156) -#161 := [rewrite]: #160 -#164 := [monotonicity #161]: #163 -#169 := [trans #164 #167]: #168 -#172 := [monotonicity #169]: #171 -#175 := [quant-intro #172]: #174 -#116 := [asserted]: #49 -#176 := [mp #116 #175]: #173 -#382 := [mp #176 #381]: #379 -#357 := [mp~ #382 #356]: #379 -#474 := [mp #357 #473]: #471 -#566 := [mp #474 #565]: #561 -#676 := (not #561) -#677 := (or #676 #673) -#658 := (= #657 #656) -#660 := (= #659 #656) -#662 := (ite #73 #661 #660) -#612 := (+ #611 #158) -#613 := (>= #612 0::int) -#663 := (ite #613 #662 #658) -#678 := (or #676 #663) -#680 := (iff #678 #677) -#682 := (iff #677 #677) -#683 := [rewrite]: #682 -#674 := (iff #663 #673) -#671 := (iff #658 #670) -#672 := [rewrite]: #671 -#668 := (iff #662 #667) -#665 := (iff #660 #664) -#666 := [rewrite]: #665 -#669 := [monotonicity #279 #666]: #668 -#626 := (iff #613 #623) -#615 := (+ #158 #611) -#618 := (>= #615 0::int) -#624 := (iff #618 #623) -#625 := [rewrite]: #624 -#619 := (iff #613 #618) -#616 := (= #612 #615) -#617 := [rewrite]: #616 -#620 := [monotonicity #617]: #619 -#627 := [trans #620 #625]: #626 -#675 := [monotonicity #627 #669 #672]: #674 -#681 := [monotonicity #675]: #680 -#684 := [trans #681 #683]: #680 -#679 := [quant-inst]: #678 -#685 := [mp #679 #684]: #677 -#1311 := [unit-resolution #685 #566]: #673 -#1312 := (not #987) -#1313 := (or #1312 #623) -#1314 := [th-lemma]: #1313 -#1315 := [unit-resolution #1314 #1281]: #623 -#645 := (not #623) -#698 := (not #673) -#699 := (or #698 #645 #667) -#700 := [def-axiom]: #699 -#1316 := [unit-resolution #700 #1315 #1311]: #667 -#686 := (not #667) -#1317 := (or #686 #661) -#687 := (not #277) -#688 := (or #686 #687 #661) -#689 := [def-axiom]: #688 -#1318 := [unit-resolution #689 #282]: #1317 -#1319 := [unit-resolution #1318 #1316]: #661 -#1321 := [symm #1319]: #1320 -#1323 := [monotonicity #1321]: #1322 -#1325 := [monotonicity #1323]: #1324 -#1145 := (* -1::real #771) -#1240 := (+ #656 #1145) -#1241 := (<= #1240 0::real) -#1249 := (not #1241) -#1243 := [hypothesis]: #1241 -decl uf_18 :: T3 -#80 := uf_18 -#1040 := (uf_1 uf_18 #44) -#1043 := (* -1::real #1040) -#1156 := (+ #771 #1043) -#1157 := (>= #1156 0::real) -#1189 := (not #1157) -#708 := (uf_1 #91 #44) -#1168 := (+ #708 #1043) -#1169 := (<= #1168 0::real) -#1174 := (or #1157 #1169) -#1177 := (not #1174) -#89 := (uf_1 #88 #6) -#552 := (pattern #89) -#81 := (uf_1 uf_18 #6) -#594 := (pattern #81) -#324 := (* -1::real #92) -#325 := (+ #81 #324) -#323 := (>= #325 0::real) -#317 := (* -1::real #89) -#318 := (+ #81 #317) -#319 := (<= #318 0::real) -#436 := (or #319 #323) -#437 := (not #436) -#601 := (forall (vars (?x11 T2)) (:pat #594 #552 #542) #437) -#440 := (forall (vars (?x11 T2)) #437) -#604 := (iff #440 #601) -#602 := (iff #437 #437) -#603 := [refl]: #602 -#605 := [quant-intro #603]: #604 -#326 := (not #323) -#320 := (not #319) -#329 := (and #320 #326) -#332 := (forall (vars (?x11 T2)) #329) -#441 := (iff #332 #440) -#438 := (iff #329 #437) -#439 := [rewrite]: #438 -#442 := [quant-intro #439]: #441 -#425 := (~ #332 #332) -#423 := (~ #329 #329) -#424 := [refl]: #423 -#426 := [nnf-pos #424]: #425 -#306 := (* -1::real #84) -#307 := (+ #81 #306) -#305 := (>= #307 0::real) -#308 := (not #305) -#301 := (* -1::real #81) -#79 := (uf_1 #78 #6) -#302 := (+ #79 #301) -#300 := (>= #302 0::real) -#298 := (not #300) -#311 := (and #298 #308) -#314 := (forall (vars (?x10 T2)) #311) -#335 := (and #314 #332) -#93 := (< #81 #92) -#90 := (< #89 #81) -#94 := (and #90 #93) -#95 := (forall (vars (?x11 T2)) #94) -#85 := (< #81 #84) -#82 := (< #79 #81) -#86 := (and #82 #85) -#87 := (forall (vars (?x10 T2)) #86) -#96 := (and #87 #95) -#336 := (iff #96 #335) -#333 := (iff #95 #332) -#330 := (iff #94 #329) -#327 := (iff #93 #326) -#328 := [rewrite]: #327 -#321 := (iff #90 #320) -#322 := [rewrite]: #321 -#331 := [monotonicity #322 #328]: #330 -#334 := [quant-intro #331]: #333 -#315 := (iff #87 #314) -#312 := (iff #86 #311) -#309 := (iff #85 #308) -#310 := [rewrite]: #309 -#303 := (iff #82 #298) -#304 := [rewrite]: #303 -#313 := [monotonicity #304 #310]: #312 -#316 := [quant-intro #313]: #315 -#337 := [monotonicity #316 #334]: #336 -#293 := [asserted]: #96 -#338 := [mp #293 #337]: #335 -#340 := [and-elim #338]: #332 -#427 := [mp~ #340 #426]: #332 -#443 := [mp #427 #442]: #440 -#606 := [mp #443 #605]: #601 -#1124 := (not #601) -#1180 := (or #1124 #1177) -#1142 := (* -1::real #708) -#1143 := (+ #1040 #1142) -#1144 := (>= #1143 0::real) -#1146 := (+ #1040 #1145) -#1147 := (<= #1146 0::real) -#1148 := (or #1147 #1144) -#1149 := (not #1148) -#1181 := (or #1124 #1149) -#1183 := (iff #1181 #1180) -#1185 := (iff #1180 #1180) -#1186 := [rewrite]: #1185 -#1178 := (iff #1149 #1177) -#1175 := (iff #1148 #1174) -#1172 := (iff #1144 #1169) -#1162 := (+ #1142 #1040) -#1165 := (>= #1162 0::real) -#1170 := (iff #1165 #1169) -#1171 := [rewrite]: #1170 -#1166 := (iff #1144 #1165) -#1163 := (= #1143 #1162) -#1164 := [rewrite]: #1163 -#1167 := [monotonicity #1164]: #1166 -#1173 := [trans #1167 #1171]: #1172 -#1160 := (iff #1147 #1157) -#1150 := (+ #1145 #1040) -#1153 := (<= #1150 0::real) -#1158 := (iff #1153 #1157) -#1159 := [rewrite]: #1158 -#1154 := (iff #1147 #1153) -#1151 := (= #1146 #1150) -#1152 := [rewrite]: #1151 -#1155 := [monotonicity #1152]: #1154 -#1161 := [trans #1155 #1159]: #1160 -#1176 := [monotonicity #1161 #1173]: #1175 -#1179 := [monotonicity #1176]: #1178 -#1184 := [monotonicity #1179]: #1183 -#1187 := [trans #1184 #1186]: #1183 -#1182 := [quant-inst]: #1181 -#1188 := [mp #1182 #1187]: #1180 -#1244 := [unit-resolution #1188 #606]: #1177 -#1190 := (or #1174 #1189) -#1191 := [def-axiom]: #1190 -#1245 := [unit-resolution #1191 #1244]: #1189 -#1054 := (+ #656 #1043) -#1055 := (<= #1054 0::real) -#1079 := (not #1055) -#607 := (uf_1 #78 #44) -#1044 := (+ #607 #1043) -#1045 := (>= #1044 0::real) -#1060 := (or #1045 #1055) -#1063 := (not #1060) -#567 := (pattern #79) -#428 := (or #300 #305) -#429 := (not #428) -#595 := (forall (vars (?x10 T2)) (:pat #567 #594 #560) #429) -#432 := (forall (vars (?x10 T2)) #429) -#598 := (iff #432 #595) -#596 := (iff #429 #429) -#597 := [refl]: #596 -#599 := [quant-intro #597]: #598 -#433 := (iff #314 #432) -#430 := (iff #311 #429) -#431 := [rewrite]: #430 -#434 := [quant-intro #431]: #433 -#420 := (~ #314 #314) -#418 := (~ #311 #311) -#419 := [refl]: #418 -#421 := [nnf-pos #419]: #420 -#339 := [and-elim #338]: #314 -#422 := [mp~ #339 #421]: #314 -#435 := [mp #422 #434]: #432 -#600 := [mp #435 #599]: #595 -#1066 := (not #595) -#1067 := (or #1066 #1063) -#1039 := (* -1::real #656) -#1041 := (+ #1040 #1039) -#1042 := (>= #1041 0::real) -#1046 := (or #1045 #1042) -#1047 := (not #1046) -#1068 := (or #1066 #1047) -#1070 := (iff #1068 #1067) -#1072 := (iff #1067 #1067) -#1073 := [rewrite]: #1072 -#1064 := (iff #1047 #1063) -#1061 := (iff #1046 #1060) -#1058 := (iff #1042 #1055) -#1048 := (+ #1039 #1040) -#1051 := (>= #1048 0::real) -#1056 := (iff #1051 #1055) -#1057 := [rewrite]: #1056 -#1052 := (iff #1042 #1051) -#1049 := (= #1041 #1048) -#1050 := [rewrite]: #1049 -#1053 := [monotonicity #1050]: #1052 -#1059 := [trans #1053 #1057]: #1058 -#1062 := [monotonicity #1059]: #1061 -#1065 := [monotonicity #1062]: #1064 -#1071 := [monotonicity #1065]: #1070 -#1074 := [trans #1071 #1073]: #1070 -#1069 := [quant-inst]: #1068 -#1075 := [mp #1069 #1074]: #1067 -#1246 := [unit-resolution #1075 #600]: #1063 -#1080 := (or #1060 #1079) -#1081 := [def-axiom]: #1080 -#1247 := [unit-resolution #1081 #1246]: #1079 -#1248 := [th-lemma #1247 #1245 #1243]: false -#1250 := [lemma #1248]: #1249 -#1253 := (or #1252 #1241) -#1254 := [th-lemma]: #1253 -#1310 := [unit-resolution #1254 #1250]: #1252 -#1326 := [mp #1310 #1325]: #796 -#1328 := (or #724 #772) -decl uf_13 :: T3 -#33 := uf_13 -#609 := (uf_1 uf_13 #44) -#773 := (= #609 #771) -#775 := (ite #724 #773 #772) -#32 := (uf_1 uf_9 #6) -#553 := (pattern #32) -#34 := (uf_1 uf_13 #6) -#551 := (pattern #34) -#456 := (= #32 #89) -#455 := (= #34 #89) -#457 := (ite #119 #455 #456) -#554 := (forall (vars (?x4 T2)) (:pat #541 #551 #552 #553) #457) -#460 := (forall (vars (?x4 T2)) #457) -#557 := (iff #460 #554) -#555 := (iff #457 #457) -#556 := [refl]: #555 -#558 := [quant-intro #556]: #557 -#143 := (ite #119 #34 #32) -#373 := (= #89 #143) -#374 := (forall (vars (?x4 T2)) #373) -#461 := (iff #374 #460) -#458 := (iff #373 #457) -#459 := [rewrite]: #458 -#462 := [quant-intro #459]: #461 -#362 := (~ #374 #374) -#364 := (~ #373 #373) -#365 := [refl]: #364 -#363 := [nnf-pos #365]: #362 -#31 := (uf_3 uf_12 #6) -#148 := (= #31 #143) -#151 := (forall (vars (?x4 T2)) #148) -#375 := (iff #151 #374) -#376 := [rewrite* #113]: #375 -#35 := (ite #17 #32 #34) -#36 := (= #31 #35) -#37 := (forall (vars (?x4 T2)) #36) -#152 := (iff #37 #151) -#149 := (iff #36 #148) -#146 := (= #35 #143) -#140 := (ite #118 #32 #34) -#144 := (= #140 #143) -#145 := [rewrite]: #144 -#141 := (= #35 #140) -#142 := [monotonicity #123]: #141 -#147 := [trans #142 #145]: #146 -#150 := [monotonicity #147]: #149 -#153 := [quant-intro #150]: #152 -#115 := [asserted]: #37 -#154 := [mp #115 #153]: #151 -#377 := [mp #154 #376]: #374 -#360 := [mp~ #377 #363]: #374 -#463 := [mp #360 #462]: #460 -#559 := [mp #463 #558]: #554 -#778 := (not #554) -#779 := (or #778 #775) -#714 := (+ #611 #120) -#715 := (>= #714 0::int) -#774 := (ite #715 #773 #772) -#780 := (or #778 #774) -#782 := (iff #780 #779) -#784 := (iff #779 #779) -#785 := [rewrite]: #784 -#776 := (iff #774 #775) -#727 := (iff #715 #724) -#717 := (+ #120 #611) -#720 := (>= #717 0::int) -#725 := (iff #720 #724) -#726 := [rewrite]: #725 -#721 := (iff #715 #720) -#718 := (= #714 #717) -#719 := [rewrite]: #718 -#722 := [monotonicity #719]: #721 -#728 := [trans #722 #726]: #727 -#777 := [monotonicity #728]: #776 -#783 := [monotonicity #777]: #782 -#786 := [trans #783 #785]: #782 -#781 := [quant-inst]: #780 -#787 := [mp #781 #786]: #779 -#1327 := [unit-resolution #787 #559]: #775 -#788 := (not #775) -#791 := (or #788 #724 #772) -#792 := [def-axiom]: #791 -#1329 := [unit-resolution #792 #1327]: #1328 -#1330 := [unit-resolution #1329 #1326]: #724 -#988 := (>= #622 0::int) -#1331 := (or #1312 #988) -#1332 := [th-lemma]: #1331 -#1333 := [unit-resolution #1332 #1281]: #988 -#761 := (not #724) -#1334 := (not #988) -#1335 := (or #1271 #1334 #761) -#1336 := [th-lemma]: #1335 -#1337 := [unit-resolution #1336 #1333 #1330]: #1271 -#1338 := (not #1271) -#1340 := (or #1269 #1338 #1339) -#1341 := [th-lemma]: #1340 -#1343 := [unit-resolution #1341 #1337]: #1342 -#1344 := [unit-resolution #1343 #1299]: #1339 -#990 := (>= #916 0::int) -#1345 := (or #1302 #990) -#1346 := [th-lemma]: #1345 -#1347 := [unit-resolution #1346 #1301]: #990 -#1348 := (not #990) -#1349 := (or #836 #1348 #1265) -#1350 := [th-lemma]: #1349 -#1351 := [unit-resolution #1350 #1347 #1344]: #836 -#1353 := (or #815 #800) -#801 := (uf_1 uf_13 #22) -#820 := (= #799 #801) -#823 := (ite #815 #820 #800) -#476 := (= #32 #79) -#475 := (= #34 #79) -#477 := (ite #157 #475 #476) -#568 := (forall (vars (?x6 T2)) (:pat #541 #551 #567 #553) #477) -#480 := (forall (vars (?x6 T2)) #477) -#571 := (iff #480 #568) -#569 := (iff #477 #477) -#570 := [refl]: #569 -#572 := [quant-intro #570]: #571 -#181 := (ite #157 #34 #32) -#383 := (= #79 #181) -#384 := (forall (vars (?x6 T2)) #383) -#481 := (iff #384 #480) -#478 := (iff #383 #477) -#479 := [rewrite]: #478 -#482 := [quant-intro #479]: #481 -#352 := (~ #384 #384) -#354 := (~ #383 #383) -#355 := [refl]: #354 -#353 := [nnf-pos #355]: #352 -#51 := (uf_3 uf_16 #6) -#186 := (= #51 #181) -#189 := (forall (vars (?x6 T2)) #186) -#385 := (iff #189 #384) -#386 := [rewrite* #113]: #385 -#52 := (ite #42 #32 #34) -#53 := (= #51 #52) -#54 := (forall (vars (?x6 T2)) #53) -#190 := (iff #54 #189) -#187 := (iff #53 #186) -#184 := (= #52 #181) -#178 := (ite #156 #32 #34) -#182 := (= #178 #181) -#183 := [rewrite]: #182 -#179 := (= #52 #178) -#180 := [monotonicity #161]: #179 -#185 := [trans #180 #183]: #184 -#188 := [monotonicity #185]: #187 -#191 := [quant-intro #188]: #190 -#139 := [asserted]: #54 -#192 := [mp #139 #191]: #189 -#387 := [mp #192 #386]: #384 -#402 := [mp~ #387 #353]: #384 -#483 := [mp #402 #482]: #480 -#573 := [mp #483 #572]: #568 -#634 := (not #568) -#826 := (or #634 #823) -#802 := (= #801 #799) -#804 := (+ #803 #158) -#805 := (>= #804 0::int) -#806 := (ite #805 #802 #800) -#827 := (or #634 #806) -#829 := (iff #827 #826) -#831 := (iff #826 #826) -#832 := [rewrite]: #831 -#824 := (iff #806 #823) -#821 := (iff #802 #820) -#822 := [rewrite]: #821 -#818 := (iff #805 #815) -#807 := (+ #158 #803) -#810 := (>= #807 0::int) -#816 := (iff #810 #815) -#817 := [rewrite]: #816 -#811 := (iff #805 #810) -#808 := (= #804 #807) -#809 := [rewrite]: #808 -#812 := [monotonicity #809]: #811 -#819 := [trans #812 #817]: #818 -#825 := [monotonicity #819 #822]: #824 -#830 := [monotonicity #825]: #829 -#833 := [trans #830 #832]: #829 -#828 := [quant-inst]: #827 -#834 := [mp #828 #833]: #826 -#1352 := [unit-resolution #834 #573]: #823 -#835 := (not #823) -#839 := (or #835 #815 #800) -#840 := [def-axiom]: #839 -#1354 := [unit-resolution #840 #1352]: #1353 -#1355 := [unit-resolution #1354 #1351]: #800 -#1357 := [symm #1355]: #1356 -#1358 := [trans #1357 #1309]: #1266 -#1359 := (not #1266) -#1360 := (or #1359 #1272) -#1361 := [th-lemma]: #1360 -#1362 := [unit-resolution #1361 #1358]: #1272 -#1085 := (uf_1 uf_18 #22) -#1099 := (* -1::real #1085) -#1112 := (+ #902 #1099) -#1113 := (<= #1112 0::real) -#1137 := (not #1113) -#960 := (uf_1 #88 #22) -#1100 := (+ #960 #1099) -#1101 := (>= #1100 0::real) -#1118 := (or #1101 #1113) -#1121 := (not #1118) -#1125 := (or #1124 #1121) -#1086 := (+ #1085 #1084) -#1087 := (>= #1086 0::real) -#1088 := (* -1::real #960) -#1089 := (+ #1085 #1088) -#1090 := (<= #1089 0::real) -#1091 := (or #1090 #1087) -#1092 := (not #1091) -#1126 := (or #1124 #1092) -#1128 := (iff #1126 #1125) -#1130 := (iff #1125 #1125) -#1131 := [rewrite]: #1130 -#1122 := (iff #1092 #1121) -#1119 := (iff #1091 #1118) -#1116 := (iff #1087 #1113) -#1106 := (+ #1084 #1085) -#1109 := (>= #1106 0::real) -#1114 := (iff #1109 #1113) -#1115 := [rewrite]: #1114 -#1110 := (iff #1087 #1109) -#1107 := (= #1086 #1106) -#1108 := [rewrite]: #1107 -#1111 := [monotonicity #1108]: #1110 -#1117 := [trans #1111 #1115]: #1116 -#1104 := (iff #1090 #1101) -#1093 := (+ #1088 #1085) -#1096 := (<= #1093 0::real) -#1102 := (iff #1096 #1101) -#1103 := [rewrite]: #1102 -#1097 := (iff #1090 #1096) -#1094 := (= #1089 #1093) -#1095 := [rewrite]: #1094 -#1098 := [monotonicity #1095]: #1097 -#1105 := [trans #1098 #1103]: #1104 -#1120 := [monotonicity #1105 #1117]: #1119 -#1123 := [monotonicity #1120]: #1122 -#1129 := [monotonicity #1123]: #1128 -#1132 := [trans #1129 #1131]: #1128 -#1127 := [quant-inst]: #1126 -#1133 := [mp #1127 #1132]: #1125 -#1363 := [unit-resolution #1133 #606]: #1121 -#1138 := (or #1118 #1137) -#1139 := [def-axiom]: #1138 -#1364 := [unit-resolution #1139 #1363]: #1137 -#1200 := (+ #799 #1099) -#1201 := (>= #1200 0::real) -#1231 := (not #1201) -#847 := (uf_1 #83 #22) -#1210 := (+ #847 #1099) -#1211 := (<= #1210 0::real) -#1216 := (or #1201 #1211) -#1219 := (not #1216) -#1222 := (or #1066 #1219) -#1197 := (* -1::real #847) -#1198 := (+ #1085 #1197) -#1199 := (>= #1198 0::real) -#1202 := (or #1201 #1199) -#1203 := (not #1202) -#1223 := (or #1066 #1203) -#1225 := (iff #1223 #1222) -#1227 := (iff #1222 #1222) -#1228 := [rewrite]: #1227 -#1220 := (iff #1203 #1219) -#1217 := (iff #1202 #1216) -#1214 := (iff #1199 #1211) -#1204 := (+ #1197 #1085) -#1207 := (>= #1204 0::real) -#1212 := (iff #1207 #1211) -#1213 := [rewrite]: #1212 -#1208 := (iff #1199 #1207) -#1205 := (= #1198 #1204) -#1206 := [rewrite]: #1205 -#1209 := [monotonicity #1206]: #1208 -#1215 := [trans #1209 #1213]: #1214 -#1218 := [monotonicity #1215]: #1217 -#1221 := [monotonicity #1218]: #1220 -#1226 := [monotonicity #1221]: #1225 -#1229 := [trans #1226 #1228]: #1225 -#1224 := [quant-inst]: #1223 -#1230 := [mp #1224 #1229]: #1222 -#1365 := [unit-resolution #1230 #600]: #1219 -#1232 := (or #1216 #1231) -#1233 := [def-axiom]: #1232 -#1366 := [unit-resolution #1233 #1365]: #1231 -[th-lemma #1366 #1364 #1362]: false -unsat -697101e22cd936070cda4e34ef646648761a3ec5 211 0 -#2 := false -#33 := 0::real -decl uf_11 :: (-> T5 T6 real) -decl uf_15 :: T6 -#28 := uf_15 -decl uf_16 :: T5 -#30 := uf_16 -#31 := (uf_11 uf_16 uf_15) -decl uf_12 :: (-> T7 T8 T5) -decl uf_14 :: T8 -#26 := uf_14 -decl uf_13 :: (-> T1 T7) -decl uf_8 :: T1 -#16 := uf_8 -#25 := (uf_13 uf_8) -#27 := (uf_12 #25 uf_14) -#29 := (uf_11 #27 uf_15) -#73 := -1::real -#84 := (* -1::real #29) -#85 := (+ #84 #31) -#74 := (* -1::real #31) -#75 := (+ #29 #74) -#112 := (>= #75 0::real) -#119 := (ite #112 #75 #85) -#127 := (* -1::real #119) -decl uf_17 :: T5 -#37 := uf_17 -#38 := (uf_11 uf_17 uf_15) -#102 := -1/3::real -#103 := (* -1/3::real #38) -#128 := (+ #103 #127) -#100 := 1/3::real -#101 := (* 1/3::real #31) -#129 := (+ #101 #128) -#130 := (<= #129 0::real) -#131 := (not #130) -#40 := 3::real -#39 := (- #31 #38) -#41 := (/ #39 3::real) -#32 := (- #29 #31) -#35 := (- #32) -#34 := (< #32 0::real) -#36 := (ite #34 #35 #32) -#42 := (< #36 #41) -#136 := (iff #42 #131) -#104 := (+ #101 #103) -#78 := (< #75 0::real) -#90 := (ite #78 #85 #75) -#109 := (< #90 #104) -#134 := (iff #109 #131) -#124 := (< #119 #104) -#132 := (iff #124 #131) -#133 := [rewrite]: #132 -#125 := (iff #109 #124) -#122 := (= #90 #119) -#113 := (not #112) -#116 := (ite #113 #85 #75) -#120 := (= #116 #119) -#121 := [rewrite]: #120 -#117 := (= #90 #116) -#114 := (iff #78 #113) -#115 := [rewrite]: #114 -#118 := [monotonicity #115]: #117 -#123 := [trans #118 #121]: #122 -#126 := [monotonicity #123]: #125 -#135 := [trans #126 #133]: #134 -#110 := (iff #42 #109) -#107 := (= #41 #104) -#93 := (* -1::real #38) -#94 := (+ #31 #93) -#97 := (/ #94 3::real) -#105 := (= #97 #104) -#106 := [rewrite]: #105 -#98 := (= #41 #97) -#95 := (= #39 #94) -#96 := [rewrite]: #95 -#99 := [monotonicity #96]: #98 -#108 := [trans #99 #106]: #107 -#91 := (= #36 #90) -#76 := (= #32 #75) -#77 := [rewrite]: #76 -#88 := (= #35 #85) -#81 := (- #75) -#86 := (= #81 #85) -#87 := [rewrite]: #86 -#82 := (= #35 #81) -#83 := [monotonicity #77]: #82 -#89 := [trans #83 #87]: #88 -#79 := (iff #34 #78) -#80 := [monotonicity #77]: #79 -#92 := [monotonicity #80 #89 #77]: #91 -#111 := [monotonicity #92 #108]: #110 -#137 := [trans #111 #135]: #136 -#72 := [asserted]: #42 -#138 := [mp #72 #137]: #131 -decl uf_1 :: T1 -#4 := uf_1 -#43 := (uf_13 uf_1) -#44 := (uf_12 #43 uf_14) -#45 := (uf_11 #44 uf_15) -#149 := (* -1::real #45) -#150 := (+ #38 #149) -#140 := (+ #93 #45) -#161 := (<= #150 0::real) -#168 := (ite #161 #140 #150) -#176 := (* -1::real #168) -#177 := (+ #103 #176) -#178 := (+ #101 #177) -#179 := (<= #178 0::real) -#180 := (not #179) -#46 := (- #45 #38) -#48 := (- #46) -#47 := (< #46 0::real) -#49 := (ite #47 #48 #46) -#50 := (< #49 #41) -#185 := (iff #50 #180) -#143 := (< #140 0::real) -#155 := (ite #143 #150 #140) -#158 := (< #155 #104) -#183 := (iff #158 #180) -#173 := (< #168 #104) -#181 := (iff #173 #180) -#182 := [rewrite]: #181 -#174 := (iff #158 #173) -#171 := (= #155 #168) -#162 := (not #161) -#165 := (ite #162 #150 #140) -#169 := (= #165 #168) -#170 := [rewrite]: #169 -#166 := (= #155 #165) -#163 := (iff #143 #162) -#164 := [rewrite]: #163 -#167 := [monotonicity #164]: #166 -#172 := [trans #167 #170]: #171 -#175 := [monotonicity #172]: #174 -#184 := [trans #175 #182]: #183 -#159 := (iff #50 #158) -#156 := (= #49 #155) -#141 := (= #46 #140) -#142 := [rewrite]: #141 -#153 := (= #48 #150) -#146 := (- #140) -#151 := (= #146 #150) -#152 := [rewrite]: #151 -#147 := (= #48 #146) -#148 := [monotonicity #142]: #147 -#154 := [trans #148 #152]: #153 -#144 := (iff #47 #143) -#145 := [monotonicity #142]: #144 -#157 := [monotonicity #145 #154 #142]: #156 -#160 := [monotonicity #157 #108]: #159 -#186 := [trans #160 #184]: #185 -#139 := [asserted]: #50 -#187 := [mp #139 #186]: #180 -#299 := (+ #140 #176) -#300 := (<= #299 0::real) -#290 := (= #140 #168) -#329 := [hypothesis]: #162 -#191 := (+ #29 #149) -#192 := (<= #191 0::real) -#51 := (<= #29 #45) -#193 := (iff #51 #192) -#194 := [rewrite]: #193 -#188 := [asserted]: #51 -#195 := [mp #188 #194]: #192 -#298 := (+ #75 #127) -#301 := (<= #298 0::real) -#284 := (= #75 #119) -#302 := [hypothesis]: #113 -#296 := (+ #85 #127) -#297 := (<= #296 0::real) -#285 := (= #85 #119) -#288 := (or #112 #285) -#289 := [def-axiom]: #288 -#303 := [unit-resolution #289 #302]: #285 -#304 := (not #285) -#305 := (or #304 #297) -#306 := [th-lemma]: #305 -#307 := [unit-resolution #306 #303]: #297 -#315 := (not #290) -#310 := (not #300) -#311 := (or #310 #112) -#308 := [hypothesis]: #300 -#309 := [th-lemma #308 #307 #138 #302 #187 #195]: false -#312 := [lemma #309]: #311 -#322 := [unit-resolution #312 #302]: #310 -#316 := (or #315 #300) -#313 := [hypothesis]: #310 -#314 := [hypothesis]: #290 -#317 := [th-lemma]: #316 -#318 := [unit-resolution #317 #314 #313]: false -#319 := [lemma #318]: #316 -#323 := [unit-resolution #319 #322]: #315 -#292 := (or #162 #290) -#293 := [def-axiom]: #292 -#324 := [unit-resolution #293 #323]: #162 -#325 := [th-lemma #324 #307 #138 #302 #195]: false -#326 := [lemma #325]: #112 -#286 := (or #113 #284) -#287 := [def-axiom]: #286 -#330 := [unit-resolution #287 #326]: #284 -#331 := (not #284) -#332 := (or #331 #301) -#333 := [th-lemma]: #332 -#334 := [unit-resolution #333 #330]: #301 -#335 := [th-lemma #326 #334 #195 #329 #138]: false -#336 := [lemma #335]: #161 -#327 := [unit-resolution #293 #336]: #290 -#328 := [unit-resolution #319 #327]: #300 -[th-lemma #326 #334 #195 #328 #187 #138]: false -unsat -76dd2264ac7b34ef64af3aea7f49f78e51b20a36 285 0 -#2 := false -#7 := 0::real -decl uf_4 :: real -#16 := uf_4 -#40 := -1::real -#116 := (* -1::real uf_4) -decl uf_3 :: real -#11 := uf_3 -#117 := (+ uf_3 #116) -#128 := (<= #117 0::real) -#129 := (not #128) -#220 := 2/3::real -#221 := (* 2/3::real uf_3) -#222 := (+ #221 #116) -decl uf_2 :: real -#5 := uf_2 -#67 := 1/3::real -#68 := (* 1/3::real uf_2) -#233 := (+ #68 #222) -#243 := (<= #233 0::real) -#268 := (not #243) -#287 := [hypothesis]: #268 -#41 := (* -1::real uf_2) -decl uf_1 :: real -#4 := uf_1 -#42 := (+ uf_1 #41) -#79 := (>= #42 0::real) -#80 := (not #79) -#297 := (or #80 #243) -#158 := (+ uf_1 #116) -#159 := (<= #158 0::real) -#22 := (<= uf_1 uf_4) -#160 := (iff #22 #159) -#161 := [rewrite]: #160 -#155 := [asserted]: #22 -#162 := [mp #155 #161]: #159 -#200 := (* 1/3::real uf_3) -#198 := -4/3::real -#199 := (* -4/3::real uf_2) -#201 := (+ #199 #200) -#202 := (+ uf_1 #201) -#203 := (>= #202 0::real) -#258 := (not #203) -#292 := [hypothesis]: #79 -#293 := (or #80 #258) -#69 := -1/3::real -#70 := (* -1/3::real uf_3) -#186 := -2/3::real -#187 := (* -2/3::real uf_2) -#188 := (+ #187 #70) -#189 := (+ uf_1 #188) -#204 := (<= #189 0::real) -#205 := (ite #79 #203 #204) -#210 := (not #205) -#51 := (* -1::real uf_1) -#52 := (+ #51 uf_2) -#86 := (ite #79 #42 #52) -#94 := (* -1::real #86) -#95 := (+ #70 #94) -#96 := (+ #68 #95) -#97 := (<= #96 0::real) -#98 := (not #97) -#211 := (iff #98 #210) -#208 := (iff #97 #205) -#182 := 4/3::real -#183 := (* 4/3::real uf_2) -#184 := (+ #183 #70) -#185 := (+ #51 #184) -#190 := (ite #79 #185 #189) -#195 := (<= #190 0::real) -#206 := (iff #195 #205) -#207 := [rewrite]: #206 -#196 := (iff #97 #195) -#193 := (= #96 #190) -#172 := (+ #41 #70) -#173 := (+ uf_1 #172) -#170 := (+ uf_2 #70) -#171 := (+ #51 #170) -#174 := (ite #79 #171 #173) -#179 := (+ #68 #174) -#191 := (= #179 #190) -#192 := [rewrite]: #191 -#180 := (= #96 #179) -#177 := (= #95 #174) -#164 := (ite #79 #52 #42) -#167 := (+ #70 #164) -#175 := (= #167 #174) -#176 := [rewrite]: #175 -#168 := (= #95 #167) -#156 := (= #94 #164) -#165 := [rewrite]: #156 -#169 := [monotonicity #165]: #168 -#178 := [trans #169 #176]: #177 -#181 := [monotonicity #178]: #180 -#194 := [trans #181 #192]: #193 -#197 := [monotonicity #194]: #196 -#209 := [trans #197 #207]: #208 -#212 := [monotonicity #209]: #211 -#13 := 3::real -#12 := (- uf_2 uf_3) -#14 := (/ #12 3::real) -#6 := (- uf_1 uf_2) -#9 := (- #6) -#8 := (< #6 0::real) -#10 := (ite #8 #9 #6) -#15 := (< #10 #14) -#103 := (iff #15 #98) -#71 := (+ #68 #70) -#45 := (< #42 0::real) -#57 := (ite #45 #52 #42) -#76 := (< #57 #71) -#101 := (iff #76 #98) -#91 := (< #86 #71) -#99 := (iff #91 #98) -#100 := [rewrite]: #99 -#92 := (iff #76 #91) -#89 := (= #57 #86) -#83 := (ite #80 #52 #42) -#87 := (= #83 #86) -#88 := [rewrite]: #87 -#84 := (= #57 #83) -#81 := (iff #45 #80) -#82 := [rewrite]: #81 -#85 := [monotonicity #82]: #84 -#90 := [trans #85 #88]: #89 -#93 := [monotonicity #90]: #92 -#102 := [trans #93 #100]: #101 -#77 := (iff #15 #76) -#74 := (= #14 #71) -#60 := (* -1::real uf_3) -#61 := (+ uf_2 #60) -#64 := (/ #61 3::real) -#72 := (= #64 #71) -#73 := [rewrite]: #72 -#65 := (= #14 #64) -#62 := (= #12 #61) -#63 := [rewrite]: #62 -#66 := [monotonicity #63]: #65 -#75 := [trans #66 #73]: #74 -#58 := (= #10 #57) -#43 := (= #6 #42) -#44 := [rewrite]: #43 -#55 := (= #9 #52) -#48 := (- #42) -#53 := (= #48 #52) -#54 := [rewrite]: #53 -#49 := (= #9 #48) -#50 := [monotonicity #44]: #49 -#56 := [trans #50 #54]: #55 -#46 := (iff #8 #45) -#47 := [monotonicity #44]: #46 -#59 := [monotonicity #47 #56 #44]: #58 -#78 := [monotonicity #59 #75]: #77 -#104 := [trans #78 #102]: #103 -#39 := [asserted]: #15 -#105 := [mp #39 #104]: #98 -#213 := [mp #105 #212]: #210 -#259 := (or #205 #80 #258) -#260 := [def-axiom]: #259 -#294 := [unit-resolution #260 #213]: #293 -#295 := [unit-resolution #294 #292]: #258 -#296 := [th-lemma #287 #292 #295 #162]: false -#298 := [lemma #296]: #297 -#299 := [unit-resolution #298 #287]: #80 -#261 := (not #204) -#281 := (or #79 #261) -#262 := (or #205 #79 #261) -#263 := [def-axiom]: #262 -#282 := [unit-resolution #263 #213]: #281 -#300 := [unit-resolution #282 #299]: #261 -#290 := (or #79 #204 #243) -#276 := [hypothesis]: #261 -#288 := [hypothesis]: #80 -#289 := [th-lemma #288 #276 #162 #287]: false -#291 := [lemma #289]: #290 -#301 := [unit-resolution #291 #300 #299 #287]: false -#302 := [lemma #301]: #243 -#303 := (or #129 #268) -#223 := (* -4/3::real uf_3) -#224 := (+ #223 uf_4) -#234 := (+ #68 #224) -#244 := (<= #234 0::real) -#245 := (ite #128 #243 #244) -#250 := (not #245) -#107 := (+ #60 uf_4) -#135 := (ite #128 #107 #117) -#143 := (* -1::real #135) -#144 := (+ #70 #143) -#145 := (+ #68 #144) -#146 := (<= #145 0::real) -#147 := (not #146) -#251 := (iff #147 #250) -#248 := (iff #146 #245) -#235 := (ite #128 #233 #234) -#240 := (<= #235 0::real) -#246 := (iff #240 #245) -#247 := [rewrite]: #246 -#241 := (iff #146 #240) -#238 := (= #145 #235) -#225 := (ite #128 #222 #224) -#230 := (+ #68 #225) -#236 := (= #230 #235) -#237 := [rewrite]: #236 -#231 := (= #145 #230) -#228 := (= #144 #225) -#214 := (ite #128 #117 #107) -#217 := (+ #70 #214) -#226 := (= #217 #225) -#227 := [rewrite]: #226 -#218 := (= #144 #217) -#215 := (= #143 #214) -#216 := [rewrite]: #215 -#219 := [monotonicity #216]: #218 -#229 := [trans #219 #227]: #228 -#232 := [monotonicity #229]: #231 -#239 := [trans #232 #237]: #238 -#242 := [monotonicity #239]: #241 -#249 := [trans #242 #247]: #248 -#252 := [monotonicity #249]: #251 -#17 := (- uf_4 uf_3) -#19 := (- #17) -#18 := (< #17 0::real) -#20 := (ite #18 #19 #17) -#21 := (< #20 #14) -#152 := (iff #21 #147) -#110 := (< #107 0::real) -#122 := (ite #110 #117 #107) -#125 := (< #122 #71) -#150 := (iff #125 #147) -#140 := (< #135 #71) -#148 := (iff #140 #147) -#149 := [rewrite]: #148 -#141 := (iff #125 #140) -#138 := (= #122 #135) -#132 := (ite #129 #117 #107) -#136 := (= #132 #135) -#137 := [rewrite]: #136 -#133 := (= #122 #132) -#130 := (iff #110 #129) -#131 := [rewrite]: #130 -#134 := [monotonicity #131]: #133 -#139 := [trans #134 #137]: #138 -#142 := [monotonicity #139]: #141 -#151 := [trans #142 #149]: #150 -#126 := (iff #21 #125) -#123 := (= #20 #122) -#108 := (= #17 #107) -#109 := [rewrite]: #108 -#120 := (= #19 #117) -#113 := (- #107) -#118 := (= #113 #117) -#119 := [rewrite]: #118 -#114 := (= #19 #113) -#115 := [monotonicity #109]: #114 -#121 := [trans #115 #119]: #120 -#111 := (iff #18 #110) -#112 := [monotonicity #109]: #111 -#124 := [monotonicity #112 #121 #109]: #123 -#127 := [monotonicity #124 #75]: #126 -#153 := [trans #127 #151]: #152 -#106 := [asserted]: #21 -#154 := [mp #106 #153]: #147 -#253 := [mp #154 #252]: #250 -#269 := (or #245 #129 #268) -#270 := [def-axiom]: #269 -#304 := [unit-resolution #270 #253]: #303 -#305 := [unit-resolution #304 #302]: #129 -#271 := (not #244) -#306 := (or #128 #271) -#272 := (or #245 #128 #271) -#273 := [def-axiom]: #272 -#307 := [unit-resolution #273 #253]: #306 -#308 := [unit-resolution #307 #305]: #271 -#285 := (or #128 #244) -#274 := [hypothesis]: #271 -#275 := [hypothesis]: #129 -#278 := (or #204 #128 #244) -#277 := [th-lemma #276 #275 #274 #162]: false -#279 := [lemma #277]: #278 -#280 := [unit-resolution #279 #275 #274]: #204 -#283 := [unit-resolution #282 #280]: #79 -#284 := [th-lemma #275 #274 #283 #162]: false -#286 := [lemma #284]: #285 -[unit-resolution #286 #308 #305]: false -unsat -5bc83521693fc90ddbd62a1d655c9b76740f7f5c 97 0 -#2 := false -#18 := 0::real -decl uf_1 :: (-> T2 T1 real) -decl uf_5 :: T1 -#11 := uf_5 -decl uf_2 :: T2 -#4 := uf_2 -#20 := (uf_1 uf_2 uf_5) -#42 := -1::real -#53 := (* -1::real #20) -decl uf_3 :: T2 -#7 := uf_3 -#19 := (uf_1 uf_3 uf_5) -#54 := (+ #19 #53) -#63 := (<= #54 0::real) -#21 := (- #19 #20) -#22 := (< 0::real #21) -#23 := (not #22) -#74 := (iff #23 #63) -#57 := (< 0::real #54) -#60 := (not #57) -#72 := (iff #60 #63) -#64 := (not #63) -#67 := (not #64) -#70 := (iff #67 #63) -#71 := [rewrite]: #70 -#68 := (iff #60 #67) -#65 := (iff #57 #64) -#66 := [rewrite]: #65 -#69 := [monotonicity #66]: #68 -#73 := [trans #69 #71]: #72 -#61 := (iff #23 #60) -#58 := (iff #22 #57) -#55 := (= #21 #54) -#56 := [rewrite]: #55 -#59 := [monotonicity #56]: #58 -#62 := [monotonicity #59]: #61 -#75 := [trans #62 #73]: #74 -#41 := [asserted]: #23 -#76 := [mp #41 #75]: #63 -#5 := (:var 0 T1) -#8 := (uf_1 uf_3 #5) -#141 := (pattern #8) -#6 := (uf_1 uf_2 #5) -#140 := (pattern #6) -#45 := (* -1::real #8) -#46 := (+ #6 #45) -#44 := (>= #46 0::real) -#43 := (not #44) -#142 := (forall (vars (?x1 T1)) (:pat #140 #141) #43) -#49 := (forall (vars (?x1 T1)) #43) -#145 := (iff #49 #142) -#143 := (iff #43 #43) -#144 := [refl]: #143 -#146 := [quant-intro #144]: #145 -#80 := (~ #49 #49) -#82 := (~ #43 #43) -#83 := [refl]: #82 -#81 := [nnf-pos #83]: #80 -#9 := (< #6 #8) -#10 := (forall (vars (?x1 T1)) #9) -#50 := (iff #10 #49) -#47 := (iff #9 #43) -#48 := [rewrite]: #47 -#51 := [quant-intro #48]: #50 -#39 := [asserted]: #10 -#52 := [mp #39 #51]: #49 -#79 := [mp~ #52 #81]: #49 -#147 := [mp #79 #146]: #142 -#164 := (not #142) -#165 := (or #164 #64) -#148 := (* -1::real #19) -#149 := (+ #20 #148) -#150 := (>= #149 0::real) -#151 := (not #150) -#166 := (or #164 #151) -#168 := (iff #166 #165) -#170 := (iff #165 #165) -#171 := [rewrite]: #170 -#162 := (iff #151 #64) -#160 := (iff #150 #63) -#152 := (+ #148 #20) -#155 := (>= #152 0::real) -#158 := (iff #155 #63) -#159 := [rewrite]: #158 -#156 := (iff #150 #155) -#153 := (= #149 #152) -#154 := [rewrite]: #153 -#157 := [monotonicity #154]: #156 -#161 := [trans #157 #159]: #160 -#163 := [monotonicity #161]: #162 -#169 := [monotonicity #163]: #168 -#172 := [trans #169 #171]: #168 -#167 := [quant-inst]: #166 -#173 := [mp #167 #172]: #165 -[unit-resolution #173 #147 #76]: false -unsat -537f6487ce8905f62d380a496ea77f3492821720 57 0 -#2 := false -#4 := 0::real -decl uf_1 :: (-> T2 real) -decl uf_2 :: (-> T1 T1 T2) -decl uf_12 :: (-> T4 T1) -decl uf_4 :: T4 -#11 := uf_4 -#39 := (uf_12 uf_4) -decl uf_10 :: T4 -#27 := uf_10 -#38 := (uf_12 uf_10) -#40 := (uf_2 #38 #39) -#41 := (uf_1 #40) -#264 := (>= #41 0::real) -#266 := (not #264) -#43 := (= #41 0::real) -#44 := (not #43) -#131 := [asserted]: #44 -#272 := (or #43 #266) -#42 := (<= #41 0::real) -#130 := [asserted]: #42 -#265 := (not #42) -#270 := (or #43 #265 #266) -#271 := [th-lemma]: #270 -#273 := [unit-resolution #271 #130]: #272 -#274 := [unit-resolution #273 #131]: #266 -#6 := (:var 0 T1) -#5 := (:var 1 T1) -#7 := (uf_2 #5 #6) -#241 := (pattern #7) -#8 := (uf_1 #7) -#65 := (>= #8 0::real) -#242 := (forall (vars (?x1 T1) (?x2 T1)) (:pat #241) #65) -#66 := (forall (vars (?x1 T1) (?x2 T1)) #65) -#245 := (iff #66 #242) -#243 := (iff #65 #65) -#244 := [refl]: #243 -#246 := [quant-intro #244]: #245 -#149 := (~ #66 #66) -#151 := (~ #65 #65) -#152 := [refl]: #151 -#150 := [nnf-pos #152]: #149 -#9 := (<= 0::real #8) -#10 := (forall (vars (?x1 T1) (?x2 T1)) #9) -#67 := (iff #10 #66) -#63 := (iff #9 #65) -#64 := [rewrite]: #63 -#68 := [quant-intro #64]: #67 -#60 := [asserted]: #10 -#69 := [mp #60 #68]: #66 -#147 := [mp~ #69 #150]: #66 -#247 := [mp #147 #246]: #242 -#267 := (not #242) -#268 := (or #267 #264) -#269 := [quant-inst]: #268 -[unit-resolution #269 #247 #274]: false -unsat -6ed731a5c059cb83dd6a40492311dd9bf8e4de9b 91 0 -#2 := false -#38 := 0::real -decl uf_1 :: (-> T1 T2 real) -decl uf_3 :: T2 -#5 := uf_3 -decl uf_4 :: T1 -#7 := uf_4 -#8 := (uf_1 uf_4 uf_3) -#35 := -1::real -#36 := (* -1::real #8) -decl uf_2 :: T1 -#4 := uf_2 -#6 := (uf_1 uf_2 uf_3) -#37 := (+ #6 #36) -#130 := (>= #37 0::real) -#155 := (not #130) -#43 := (= #6 #8) -#55 := (not #43) -#15 := (= #8 #6) -#16 := (not #15) -#56 := (iff #16 #55) -#53 := (iff #15 #43) -#54 := [rewrite]: #53 -#57 := [monotonicity #54]: #56 -#34 := [asserted]: #16 -#60 := [mp #34 #57]: #55 -#158 := (or #43 #155) -#39 := (<= #37 0::real) -#9 := (<= #6 #8) -#40 := (iff #9 #39) -#41 := [rewrite]: #40 -#32 := [asserted]: #9 -#42 := [mp #32 #41]: #39 -#154 := (not #39) -#156 := (or #43 #154 #155) -#157 := [th-lemma]: #156 -#159 := [unit-resolution #157 #42]: #158 -#160 := [unit-resolution #159 #60]: #155 -#10 := (:var 0 T2) -#12 := (uf_1 uf_2 #10) -#123 := (pattern #12) -#11 := (uf_1 uf_4 #10) -#122 := (pattern #11) -#44 := (* -1::real #12) -#45 := (+ #11 #44) -#46 := (<= #45 0::real) -#124 := (forall (vars (?x1 T2)) (:pat #122 #123) #46) -#49 := (forall (vars (?x1 T2)) #46) -#127 := (iff #49 #124) -#125 := (iff #46 #46) -#126 := [refl]: #125 -#128 := [quant-intro #126]: #127 -#62 := (~ #49 #49) -#64 := (~ #46 #46) -#65 := [refl]: #64 -#63 := [nnf-pos #65]: #62 -#13 := (<= #11 #12) -#14 := (forall (vars (?x1 T2)) #13) -#50 := (iff #14 #49) -#47 := (iff #13 #46) -#48 := [rewrite]: #47 -#51 := [quant-intro #48]: #50 -#33 := [asserted]: #14 -#52 := [mp #33 #51]: #49 -#61 := [mp~ #52 #63]: #49 -#129 := [mp #61 #128]: #124 -#144 := (not #124) -#145 := (or #144 #130) -#131 := (* -1::real #6) -#132 := (+ #8 #131) -#133 := (<= #132 0::real) -#146 := (or #144 #133) -#148 := (iff #146 #145) -#150 := (iff #145 #145) -#151 := [rewrite]: #150 -#142 := (iff #133 #130) -#134 := (+ #131 #8) -#137 := (<= #134 0::real) -#140 := (iff #137 #130) -#141 := [rewrite]: #140 -#138 := (iff #133 #137) -#135 := (= #132 #134) -#136 := [rewrite]: #135 -#139 := [monotonicity #136]: #138 -#143 := [trans #139 #141]: #142 -#149 := [monotonicity #143]: #148 -#152 := [trans #149 #151]: #148 -#147 := [quant-inst]: #146 -#153 := [mp #147 #152]: #145 -[unit-resolution #153 #129 #160]: false -unsat -283acece9403e0ed1dff5dca04d9b1e77248a71c 222 0 -#2 := false -#4 := 0::real -decl uf_2 :: (-> T2 T1 real) -decl uf_5 :: T1 -#15 := uf_5 -decl uf_3 :: T2 -#7 := uf_3 -#20 := (uf_2 uf_3 uf_5) -decl uf_6 :: T2 -#17 := uf_6 -#18 := (uf_2 uf_6 uf_5) -#59 := -1::real -#73 := (* -1::real #18) -#106 := (+ #73 #20) -decl uf_1 :: real -#5 := uf_1 -#78 := (* -1::real #20) -#79 := (+ #18 #78) -#144 := (+ uf_1 #79) -#145 := (<= #144 0::real) -#148 := (ite #145 uf_1 #106) -#279 := (* -1::real #148) -#280 := (+ uf_1 #279) -#281 := (<= #280 0::real) -#289 := (not #281) -#72 := 1/2::real -#151 := (* 1/2::real #148) -#248 := (<= #151 0::real) -#162 := (= #151 0::real) -#24 := 2::real -#27 := (- #20 #18) -#28 := (<= uf_1 #27) -#29 := (ite #28 uf_1 #27) -#30 := (/ #29 2::real) -#31 := (+ #18 #30) -#32 := (= #31 #18) -#33 := (not #32) -#34 := (not #33) -#165 := (iff #34 #162) -#109 := (<= uf_1 #106) -#112 := (ite #109 uf_1 #106) -#118 := (* 1/2::real #112) -#123 := (+ #18 #118) -#129 := (= #18 #123) -#163 := (iff #129 #162) -#154 := (+ #18 #151) -#157 := (= #18 #154) -#160 := (iff #157 #162) -#161 := [rewrite]: #160 -#158 := (iff #129 #157) -#155 := (= #123 #154) -#152 := (= #118 #151) -#149 := (= #112 #148) -#146 := (iff #109 #145) -#147 := [rewrite]: #146 -#150 := [monotonicity #147]: #149 -#153 := [monotonicity #150]: #152 -#156 := [monotonicity #153]: #155 -#159 := [monotonicity #156]: #158 -#164 := [trans #159 #161]: #163 -#142 := (iff #34 #129) -#134 := (not #129) -#137 := (not #134) -#140 := (iff #137 #129) -#141 := [rewrite]: #140 -#138 := (iff #34 #137) -#135 := (iff #33 #134) -#132 := (iff #32 #129) -#126 := (= #123 #18) -#130 := (iff #126 #129) -#131 := [rewrite]: #130 -#127 := (iff #32 #126) -#124 := (= #31 #123) -#121 := (= #30 #118) -#115 := (/ #112 2::real) -#119 := (= #115 #118) -#120 := [rewrite]: #119 -#116 := (= #30 #115) -#113 := (= #29 #112) -#107 := (= #27 #106) -#108 := [rewrite]: #107 -#110 := (iff #28 #109) -#111 := [monotonicity #108]: #110 -#114 := [monotonicity #111 #108]: #113 -#117 := [monotonicity #114]: #116 -#122 := [trans #117 #120]: #121 -#125 := [monotonicity #122]: #124 -#128 := [monotonicity #125]: #127 -#133 := [trans #128 #131]: #132 -#136 := [monotonicity #133]: #135 -#139 := [monotonicity #136]: #138 -#143 := [trans #139 #141]: #142 -#166 := [trans #143 #164]: #165 -#105 := [asserted]: #34 -#167 := [mp #105 #166]: #162 -#283 := (not #162) -#284 := (or #283 #248) -#285 := [th-lemma]: #284 -#286 := [unit-resolution #285 #167]: #248 -#287 := [hypothesis]: #281 -#53 := (<= uf_1 0::real) -#54 := (not #53) -#6 := (< 0::real uf_1) -#55 := (iff #6 #54) -#56 := [rewrite]: #55 -#50 := [asserted]: #6 -#57 := [mp #50 #56]: #54 -#288 := [th-lemma #57 #287 #286]: false -#290 := [lemma #288]: #289 -#241 := (= uf_1 #148) -#242 := (= #106 #148) -#299 := (not #242) -#282 := (+ #106 #279) -#291 := (<= #282 0::real) -#296 := (not #291) -decl uf_4 :: T2 -#10 := uf_4 -#16 := (uf_2 uf_4 uf_5) -#260 := (+ #16 #78) -#261 := (>= #260 0::real) -#266 := (not #261) -#8 := (:var 0 T1) -#11 := (uf_2 uf_4 #8) -#234 := (pattern #11) -#9 := (uf_2 uf_3 #8) -#233 := (pattern #9) -#60 := (* -1::real #11) -#61 := (+ #9 #60) -#62 := (<= #61 0::real) -#179 := (not #62) -#235 := (forall (vars (?x1 T1)) (:pat #233 #234) #179) -#178 := (forall (vars (?x1 T1)) #179) -#238 := (iff #178 #235) -#236 := (iff #179 #179) -#237 := [refl]: #236 -#239 := [quant-intro #237]: #238 -#65 := (exists (vars (?x1 T1)) #62) -#68 := (not #65) -#175 := (~ #68 #178) -#180 := (~ #179 #179) -#177 := [refl]: #180 -#176 := [nnf-neg #177]: #175 -#12 := (<= #9 #11) -#13 := (exists (vars (?x1 T1)) #12) -#14 := (not #13) -#69 := (iff #14 #68) -#66 := (iff #13 #65) -#63 := (iff #12 #62) -#64 := [rewrite]: #63 -#67 := [quant-intro #64]: #66 -#70 := [monotonicity #67]: #69 -#51 := [asserted]: #14 -#71 := [mp #51 #70]: #68 -#173 := [mp~ #71 #176]: #178 -#240 := [mp #173 #239]: #235 -#269 := (not #235) -#270 := (or #269 #266) -#250 := (* -1::real #16) -#251 := (+ #20 #250) -#252 := (<= #251 0::real) -#253 := (not #252) -#271 := (or #269 #253) -#273 := (iff #271 #270) -#275 := (iff #270 #270) -#276 := [rewrite]: #275 -#267 := (iff #253 #266) -#264 := (iff #252 #261) -#254 := (+ #250 #20) -#257 := (<= #254 0::real) -#262 := (iff #257 #261) -#263 := [rewrite]: #262 -#258 := (iff #252 #257) -#255 := (= #251 #254) -#256 := [rewrite]: #255 -#259 := [monotonicity #256]: #258 -#265 := [trans #259 #263]: #264 -#268 := [monotonicity #265]: #267 -#274 := [monotonicity #268]: #273 -#277 := [trans #274 #276]: #273 -#272 := [quant-inst]: #271 -#278 := [mp #272 #277]: #270 -#293 := [unit-resolution #278 #240]: #266 -#90 := (* 1/2::real #20) -#102 := (+ #73 #90) -#89 := (* 1/2::real #16) -#103 := (+ #89 #102) -#100 := (>= #103 0::real) -#23 := (+ #16 #20) -#25 := (/ #23 2::real) -#26 := (<= #18 #25) -#98 := (iff #26 #100) -#91 := (+ #89 #90) -#94 := (<= #18 #91) -#97 := (iff #94 #100) -#99 := [rewrite]: #97 -#95 := (iff #26 #94) -#92 := (= #25 #91) -#93 := [rewrite]: #92 -#96 := [monotonicity #93]: #95 -#101 := [trans #96 #99]: #98 -#58 := [asserted]: #26 -#104 := [mp #58 #101]: #100 -#294 := [hypothesis]: #291 -#295 := [th-lemma #294 #104 #293 #286]: false -#297 := [lemma #295]: #296 -#298 := [hypothesis]: #242 -#300 := (or #299 #291) -#301 := [th-lemma]: #300 -#302 := [unit-resolution #301 #298 #297]: false -#303 := [lemma #302]: #299 -#246 := (or #145 #242) -#247 := [def-axiom]: #246 -#304 := [unit-resolution #247 #303]: #145 -#243 := (not #145) -#244 := (or #243 #241) -#245 := [def-axiom]: #244 -#305 := [unit-resolution #245 #304]: #241 -#306 := (not #241) -#307 := (or #306 #281) -#308 := [th-lemma]: #307 -[unit-resolution #308 #305 #290]: false -unsat -c140056bfbcb9e3878073e8d474395da7df06aaf 248 0 -#2 := false -#4 := 0::real -decl uf_2 :: (-> T2 T1 real) -decl uf_5 :: T1 -#15 := uf_5 -decl uf_6 :: T2 -#17 := uf_6 -#18 := (uf_2 uf_6 uf_5) -decl uf_4 :: T2 -#10 := uf_4 -#16 := (uf_2 uf_4 uf_5) -#66 := -1::real -#137 := (* -1::real #16) -#138 := (+ #137 #18) -decl uf_1 :: real -#5 := uf_1 -#80 := (* -1::real #18) -#81 := (+ #16 #80) -#201 := (+ uf_1 #81) -#202 := (<= #201 0::real) -#205 := (ite #202 uf_1 #138) -#352 := (* -1::real #205) -#353 := (+ uf_1 #352) -#354 := (<= #353 0::real) -#362 := (not #354) -#79 := 1/2::real -#244 := (* 1/2::real #205) -#322 := (<= #244 0::real) -#245 := (= #244 0::real) -#158 := -1/2::real -#208 := (* -1/2::real #205) -#211 := (+ #18 #208) -decl uf_3 :: T2 -#7 := uf_3 -#20 := (uf_2 uf_3 uf_5) -#117 := (+ #80 #20) -#85 := (* -1::real #20) -#86 := (+ #18 #85) -#188 := (+ uf_1 #86) -#189 := (<= #188 0::real) -#192 := (ite #189 uf_1 #117) -#195 := (* 1/2::real #192) -#198 := (+ #18 #195) -#97 := (* 1/2::real #20) -#109 := (+ #80 #97) -#96 := (* 1/2::real #16) -#110 := (+ #96 #109) -#107 := (>= #110 0::real) -#214 := (ite #107 #198 #211) -#217 := (= #18 #214) -#248 := (iff #217 #245) -#241 := (= #18 #211) -#246 := (iff #241 #245) -#247 := [rewrite]: #246 -#242 := (iff #217 #241) -#239 := (= #214 #211) -#234 := (ite false #198 #211) -#237 := (= #234 #211) -#238 := [rewrite]: #237 -#235 := (= #214 #234) -#232 := (iff #107 false) -#104 := (not #107) -#24 := 2::real -#23 := (+ #16 #20) -#25 := (/ #23 2::real) -#26 := (< #25 #18) -#108 := (iff #26 #104) -#98 := (+ #96 #97) -#101 := (< #98 #18) -#106 := (iff #101 #104) -#105 := [rewrite]: #106 -#102 := (iff #26 #101) -#99 := (= #25 #98) -#100 := [rewrite]: #99 -#103 := [monotonicity #100]: #102 -#111 := [trans #103 #105]: #108 -#65 := [asserted]: #26 -#112 := [mp #65 #111]: #104 -#233 := [iff-false #112]: #232 -#236 := [monotonicity #233]: #235 -#240 := [trans #236 #238]: #239 -#243 := [monotonicity #240]: #242 -#249 := [trans #243 #247]: #248 -#33 := (- #18 #16) -#34 := (<= uf_1 #33) -#35 := (ite #34 uf_1 #33) -#36 := (/ #35 2::real) -#37 := (- #18 #36) -#28 := (- #20 #18) -#29 := (<= uf_1 #28) -#30 := (ite #29 uf_1 #28) -#31 := (/ #30 2::real) -#32 := (+ #18 #31) -#27 := (<= #18 #25) -#38 := (ite #27 #32 #37) -#39 := (= #38 #18) -#40 := (not #39) -#41 := (not #40) -#220 := (iff #41 #217) -#141 := (<= uf_1 #138) -#144 := (ite #141 uf_1 #138) -#159 := (* -1/2::real #144) -#160 := (+ #18 #159) -#120 := (<= uf_1 #117) -#123 := (ite #120 uf_1 #117) -#129 := (* 1/2::real #123) -#134 := (+ #18 #129) -#114 := (<= #18 #98) -#165 := (ite #114 #134 #160) -#171 := (= #18 #165) -#218 := (iff #171 #217) -#215 := (= #165 #214) -#212 := (= #160 #211) -#209 := (= #159 #208) -#206 := (= #144 #205) -#203 := (iff #141 #202) -#204 := [rewrite]: #203 -#207 := [monotonicity #204]: #206 -#210 := [monotonicity #207]: #209 -#213 := [monotonicity #210]: #212 -#199 := (= #134 #198) -#196 := (= #129 #195) -#193 := (= #123 #192) -#190 := (iff #120 #189) -#191 := [rewrite]: #190 -#194 := [monotonicity #191]: #193 -#197 := [monotonicity #194]: #196 -#200 := [monotonicity #197]: #199 -#187 := (iff #114 #107) -#186 := [rewrite]: #187 -#216 := [monotonicity #186 #200 #213]: #215 -#219 := [monotonicity #216]: #218 -#184 := (iff #41 #171) -#176 := (not #171) -#179 := (not #176) -#182 := (iff #179 #171) -#183 := [rewrite]: #182 -#180 := (iff #41 #179) -#177 := (iff #40 #176) -#174 := (iff #39 #171) -#168 := (= #165 #18) -#172 := (iff #168 #171) -#173 := [rewrite]: #172 -#169 := (iff #39 #168) -#166 := (= #38 #165) -#163 := (= #37 #160) -#150 := (* 1/2::real #144) -#155 := (- #18 #150) -#161 := (= #155 #160) -#162 := [rewrite]: #161 -#156 := (= #37 #155) -#153 := (= #36 #150) -#147 := (/ #144 2::real) -#151 := (= #147 #150) -#152 := [rewrite]: #151 -#148 := (= #36 #147) -#145 := (= #35 #144) -#139 := (= #33 #138) -#140 := [rewrite]: #139 -#142 := (iff #34 #141) -#143 := [monotonicity #140]: #142 -#146 := [monotonicity #143 #140]: #145 -#149 := [monotonicity #146]: #148 -#154 := [trans #149 #152]: #153 -#157 := [monotonicity #154]: #156 -#164 := [trans #157 #162]: #163 -#135 := (= #32 #134) -#132 := (= #31 #129) -#126 := (/ #123 2::real) -#130 := (= #126 #129) -#131 := [rewrite]: #130 -#127 := (= #31 #126) -#124 := (= #30 #123) -#118 := (= #28 #117) -#119 := [rewrite]: #118 -#121 := (iff #29 #120) -#122 := [monotonicity #119]: #121 -#125 := [monotonicity #122 #119]: #124 -#128 := [monotonicity #125]: #127 -#133 := [trans #128 #131]: #132 -#136 := [monotonicity #133]: #135 -#115 := (iff #27 #114) -#116 := [monotonicity #100]: #115 -#167 := [monotonicity #116 #136 #164]: #166 -#170 := [monotonicity #167]: #169 -#175 := [trans #170 #173]: #174 -#178 := [monotonicity #175]: #177 -#181 := [monotonicity #178]: #180 -#185 := [trans #181 #183]: #184 -#221 := [trans #185 #219]: #220 -#113 := [asserted]: #41 -#222 := [mp #113 #221]: #217 -#250 := [mp #222 #249]: #245 -#356 := (not #245) -#357 := (or #356 #322) -#358 := [th-lemma]: #357 -#359 := [unit-resolution #358 #250]: #322 -#360 := [hypothesis]: #354 -#60 := (<= uf_1 0::real) -#61 := (not #60) -#6 := (< 0::real uf_1) -#62 := (iff #6 #61) -#63 := [rewrite]: #62 -#57 := [asserted]: #6 -#64 := [mp #57 #63]: #61 -#361 := [th-lemma #64 #360 #359]: false -#363 := [lemma #361]: #362 -#315 := (= uf_1 #205) -#316 := (= #138 #205) -#371 := (not #316) -#355 := (+ #138 #352) -#364 := (<= #355 0::real) -#368 := (not #364) -#87 := (<= #86 0::real) -#82 := (<= #81 0::real) -#90 := (and #82 #87) -#21 := (<= #18 #20) -#19 := (<= #16 #18) -#22 := (and #19 #21) -#91 := (iff #22 #90) -#88 := (iff #21 #87) -#89 := [rewrite]: #88 -#83 := (iff #19 #82) -#84 := [rewrite]: #83 -#92 := [monotonicity #84 #89]: #91 -#59 := [asserted]: #22 -#93 := [mp #59 #92]: #90 -#95 := [and-elim #93]: #87 -#366 := [hypothesis]: #364 -#367 := [th-lemma #366 #95 #112 #359]: false -#369 := [lemma #367]: #368 -#370 := [hypothesis]: #316 -#372 := (or #371 #364) -#373 := [th-lemma]: #372 -#374 := [unit-resolution #373 #370 #369]: false -#375 := [lemma #374]: #371 -#320 := (or #202 #316) -#321 := [def-axiom]: #320 -#376 := [unit-resolution #321 #375]: #202 -#317 := (not #202) -#318 := (or #317 #315) -#319 := [def-axiom]: #318 -#377 := [unit-resolution #319 #376]: #315 -#378 := (not #315) -#379 := (or #378 #354) -#380 := [th-lemma]: #379 -[unit-resolution #380 #377 #363]: false -unsat -9df215500c4e556185e187283e11a68edbd664b5 86 0 -#2 := false -#37 := 0::real -decl uf_2 :: (-> T2 T1 real) -decl uf_4 :: T1 -#12 := uf_4 -decl uf_3 :: T2 -#5 := uf_3 -#13 := (uf_2 uf_3 uf_4) -#34 := -1::real -#140 := (* -1::real #13) -decl uf_1 :: real -#4 := uf_1 -#141 := (+ uf_1 #140) -#143 := (>= #141 0::real) -#6 := (:var 0 T1) -#7 := (uf_2 uf_3 #6) -#127 := (pattern #7) -#35 := (* -1::real #7) -#36 := (+ uf_1 #35) -#47 := (>= #36 0::real) -#134 := (forall (vars (?x2 T1)) (:pat #127) #47) -#49 := (forall (vars (?x2 T1)) #47) -#137 := (iff #49 #134) -#135 := (iff #47 #47) -#136 := [refl]: #135 -#138 := [quant-intro #136]: #137 -#67 := (~ #49 #49) -#58 := (~ #47 #47) -#66 := [refl]: #58 -#68 := [nnf-pos #66]: #67 -#10 := (<= #7 uf_1) -#11 := (forall (vars (?x2 T1)) #10) -#50 := (iff #11 #49) -#46 := (iff #10 #47) -#48 := [rewrite]: #46 -#51 := [quant-intro #48]: #50 -#32 := [asserted]: #11 -#52 := [mp #32 #51]: #49 -#69 := [mp~ #52 #68]: #49 -#139 := [mp #69 #138]: #134 -#149 := (not #134) -#150 := (or #149 #143) -#151 := [quant-inst]: #150 -#144 := [unit-resolution #151 #139]: #143 -#142 := (<= #141 0::real) -#38 := (<= #36 0::real) -#128 := (forall (vars (?x1 T1)) (:pat #127) #38) -#41 := (forall (vars (?x1 T1)) #38) -#131 := (iff #41 #128) -#129 := (iff #38 #38) -#130 := [refl]: #129 -#132 := [quant-intro #130]: #131 -#62 := (~ #41 #41) -#64 := (~ #38 #38) -#65 := [refl]: #64 -#63 := [nnf-pos #65]: #62 -#8 := (<= uf_1 #7) -#9 := (forall (vars (?x1 T1)) #8) -#42 := (iff #9 #41) -#39 := (iff #8 #38) -#40 := [rewrite]: #39 -#43 := [quant-intro #40]: #42 -#31 := [asserted]: #9 -#44 := [mp #31 #43]: #41 -#61 := [mp~ #44 #63]: #41 -#133 := [mp #61 #132]: #128 -#145 := (not #128) -#146 := (or #145 #142) -#147 := [quant-inst]: #146 -#148 := [unit-resolution #147 #133]: #142 -#45 := (= uf_1 #13) -#55 := (not #45) -#14 := (= #13 uf_1) -#15 := (not #14) -#56 := (iff #15 #55) -#53 := (iff #14 #45) -#54 := [rewrite]: #53 -#57 := [monotonicity #54]: #56 -#33 := [asserted]: #15 -#60 := [mp #33 #57]: #55 -#153 := (not #143) -#152 := (not #142) -#154 := (or #45 #152 #153) -#155 := [th-lemma]: #154 -[unit-resolution #155 #60 #148 #144]: false -unsat -7e78f7c132b9e8e998decefbcdf818aa16be5cc1 149 0 -#2 := false -#19 := 0::real -decl uf_1 :: (-> T1 T2 real) -decl uf_3 :: T2 -#5 := uf_3 -decl uf_4 :: T1 -#7 := uf_4 -#8 := (uf_1 uf_4 uf_3) -#44 := -1::real -#156 := (* -1::real #8) -decl uf_2 :: T1 -#4 := uf_2 -#6 := (uf_1 uf_2 uf_3) -#203 := (+ #6 #156) -#205 := (>= #203 0::real) -#9 := (= #6 #8) -#40 := [asserted]: #9 -#208 := (not #9) -#209 := (or #208 #205) -#210 := [th-lemma]: #209 -#211 := [unit-resolution #210 #40]: #205 -decl uf_5 :: T1 -#12 := uf_5 -#22 := (uf_1 uf_5 uf_3) -#160 := (* -1::real #22) -#161 := (+ #6 #160) -#207 := (>= #161 0::real) -#222 := (not #207) -#206 := (= #6 #22) -#216 := (not #206) -#62 := (= #8 #22) -#70 := (not #62) -#217 := (iff #70 #216) -#214 := (iff #62 #206) -#212 := (iff #206 #62) -#213 := [monotonicity #40]: #212 -#215 := [symm #213]: #214 -#218 := [monotonicity #215]: #217 -#23 := (= #22 #8) -#24 := (not #23) -#71 := (iff #24 #70) -#68 := (iff #23 #62) -#69 := [rewrite]: #68 -#72 := [monotonicity #69]: #71 -#43 := [asserted]: #24 -#75 := [mp #43 #72]: #70 -#219 := [mp #75 #218]: #216 -#225 := (or #206 #222) -#162 := (<= #161 0::real) -#172 := (+ #8 #160) -#173 := (>= #172 0::real) -#178 := (not #173) -#163 := (not #162) -#181 := (or #163 #178) -#184 := (not #181) -#10 := (:var 0 T2) -#15 := (uf_1 uf_4 #10) -#149 := (pattern #15) -#13 := (uf_1 uf_5 #10) -#148 := (pattern #13) -#11 := (uf_1 uf_2 #10) -#147 := (pattern #11) -#50 := (* -1::real #15) -#51 := (+ #13 #50) -#52 := (<= #51 0::real) -#76 := (not #52) -#45 := (* -1::real #13) -#46 := (+ #11 #45) -#47 := (<= #46 0::real) -#78 := (not #47) -#73 := (or #78 #76) -#83 := (not #73) -#150 := (forall (vars (?x1 T2)) (:pat #147 #148 #149) #83) -#86 := (forall (vars (?x1 T2)) #83) -#153 := (iff #86 #150) -#151 := (iff #83 #83) -#152 := [refl]: #151 -#154 := [quant-intro #152]: #153 -#55 := (and #47 #52) -#58 := (forall (vars (?x1 T2)) #55) -#87 := (iff #58 #86) -#84 := (iff #55 #83) -#85 := [rewrite]: #84 -#88 := [quant-intro #85]: #87 -#79 := (~ #58 #58) -#81 := (~ #55 #55) -#82 := [refl]: #81 -#80 := [nnf-pos #82]: #79 -#16 := (<= #13 #15) -#14 := (<= #11 #13) -#17 := (and #14 #16) -#18 := (forall (vars (?x1 T2)) #17) -#59 := (iff #18 #58) -#56 := (iff #17 #55) -#53 := (iff #16 #52) -#54 := [rewrite]: #53 -#48 := (iff #14 #47) -#49 := [rewrite]: #48 -#57 := [monotonicity #49 #54]: #56 -#60 := [quant-intro #57]: #59 -#41 := [asserted]: #18 -#61 := [mp #41 #60]: #58 -#77 := [mp~ #61 #80]: #58 -#89 := [mp #77 #88]: #86 -#155 := [mp #89 #154]: #150 -#187 := (not #150) -#188 := (or #187 #184) -#157 := (+ #22 #156) -#158 := (<= #157 0::real) -#159 := (not #158) -#164 := (or #163 #159) -#165 := (not #164) -#189 := (or #187 #165) -#191 := (iff #189 #188) -#193 := (iff #188 #188) -#194 := [rewrite]: #193 -#185 := (iff #165 #184) -#182 := (iff #164 #181) -#179 := (iff #159 #178) -#176 := (iff #158 #173) -#166 := (+ #156 #22) -#169 := (<= #166 0::real) -#174 := (iff #169 #173) -#175 := [rewrite]: #174 -#170 := (iff #158 #169) -#167 := (= #157 #166) -#168 := [rewrite]: #167 -#171 := [monotonicity #168]: #170 -#177 := [trans #171 #175]: #176 -#180 := [monotonicity #177]: #179 -#183 := [monotonicity #180]: #182 -#186 := [monotonicity #183]: #185 -#192 := [monotonicity #186]: #191 -#195 := [trans #192 #194]: #191 -#190 := [quant-inst]: #189 -#196 := [mp #190 #195]: #188 -#220 := [unit-resolution #196 #155]: #184 -#197 := (or #181 #162) -#198 := [def-axiom]: #197 -#221 := [unit-resolution #198 #220]: #162 -#223 := (or #206 #163 #222) -#224 := [th-lemma]: #223 -#226 := [unit-resolution #224 #221]: #225 -#227 := [unit-resolution #226 #219]: #222 -#199 := (or #181 #173) -#200 := [def-axiom]: #199 -#228 := [unit-resolution #200 #220]: #173 -[th-lemma #228 #227 #211]: false -unsat -610fb185d846b293ce6bb466b6770a65def3e59c 768 0 -#2 := false -#7 := 0::real -decl uf_2 :: real -#5 := uf_2 -#75 := -1::real -#76 := (* -1::real uf_2) -decl uf_1 :: real -#4 := uf_1 -#77 := (+ uf_1 #76) -#316 := (>= #77 0::real) -#317 := (not #316) -decl uf_8 :: real -#39 := uf_8 -#216 := (* -1::real uf_8) -#220 := (+ uf_1 #216) -#221 := (<= #220 0::real) -#86 := (* -1::real uf_1) -#87 := (+ #86 uf_2) -#323 := (ite #316 #77 #87) -#331 := (* -1::real #323) -decl uf_3 :: real -#11 := uf_3 -#95 := 1/3::real -#96 := (* 1/3::real uf_3) -#332 := (+ #96 #331) -#333 := (<= #332 0::real) -#334 := (not #333) -decl uf_4 :: real -#15 := uf_4 -#111 := (* -1::real uf_4) -#112 := (+ uf_2 #111) -#102 := (+ #76 uf_4) -#293 := (<= #112 0::real) -#300 := (ite #293 #102 #112) -#308 := (* -1::real #300) -#309 := (+ #96 #308) -#310 := (<= #309 0::real) -#311 := (not #310) -decl uf_6 :: real -#22 := uf_6 -decl uf_5 :: real -#21 := uf_5 -#133 := (* -1::real uf_5) -#134 := (+ #133 uf_6) -#123 := (* -1::real uf_6) -#124 := (+ uf_5 #123) -#270 := (>= #124 0::real) -#277 := (ite #270 #124 #134) -#285 := (* -1::real #277) -#286 := (+ #96 #285) -#287 := (<= #286 0::real) -#288 := (not #287) -decl uf_7 :: real -#28 := uf_7 -#154 := (* -1::real uf_7) -#155 := (+ uf_6 #154) -#145 := (+ #123 uf_7) -#247 := (<= #155 0::real) -#254 := (ite #247 #145 #155) -#262 := (* -1::real #254) -#263 := (+ #96 #262) -#264 := (<= #263 0::real) -#265 := (not #264) -#175 := (+ #76 uf_6) -#166 := (+ uf_2 #123) -#224 := (>= #166 0::real) -#231 := (ite #224 #166 #175) -#239 := (* -1::real #231) -#240 := (+ #96 #239) -#241 := (<= #240 0::real) -#242 := (not #241) -#217 := (+ uf_5 #216) -#215 := (>= #217 0::real) -decl uf_9 :: real -#42 := uf_9 -#206 := (* -1::real uf_9) -#212 := (+ uf_7 #206) -#211 := (>= #212 0::real) -#207 := (+ uf_4 #206) -#208 := (<= #207 0::real) -#363 := (and #208 #211 #215 #221 #242 #265 #288 #311 #334) -#44 := (<= uf_9 uf_7) -#43 := (<= uf_4 uf_9) -#45 := (and #43 #44) -#41 := (<= uf_8 uf_5) -#46 := (and #41 #45) -#40 := (<= uf_1 uf_8) -#47 := (and #40 #46) -#12 := 3::real -#13 := (/ uf_3 3::real) -#34 := (- uf_2 uf_6) -#36 := (- #34) -#35 := (< #34 0::real) -#37 := (ite #35 #36 #34) -#38 := (< #37 #13) -#48 := (and #38 #47) -#29 := (- uf_7 uf_6) -#31 := (- #29) -#30 := (< #29 0::real) -#32 := (ite #30 #31 #29) -#33 := (< #32 #13) -#49 := (and #33 #48) -#23 := (- uf_5 uf_6) -#25 := (- #23) -#24 := (< #23 0::real) -#26 := (ite #24 #25 #23) -#27 := (< #26 #13) -#50 := (and #27 #49) -#16 := (- uf_4 uf_2) -#18 := (- #16) -#17 := (< #16 0::real) -#19 := (ite #17 #18 #16) -#20 := (< #19 #13) -#51 := (and #20 #50) -#6 := (- uf_1 uf_2) -#9 := (- #6) -#8 := (< #6 0::real) -#10 := (ite #8 #9 #6) -#14 := (< #10 #13) -#52 := (and #14 #51) -#368 := (iff #52 #363) -#169 := (< #166 0::real) -#180 := (ite #169 #175 #166) -#183 := (< #180 #96) -#189 := (and #47 #183) -#148 := (< #145 0::real) -#160 := (ite #148 #155 #145) -#163 := (< #160 #96) -#194 := (and #163 #189) -#127 := (< #124 0::real) -#139 := (ite #127 #134 #124) -#142 := (< #139 #96) -#197 := (and #142 #194) -#105 := (< #102 0::real) -#117 := (ite #105 #112 #102) -#120 := (< #117 #96) -#200 := (and #120 #197) -#80 := (< #77 0::real) -#92 := (ite #80 #87 #77) -#99 := (< #92 #96) -#203 := (and #99 #200) -#366 := (iff #203 #363) -#339 := (and #208 #211) -#342 := (and #215 #339) -#345 := (and #221 #342) -#348 := (and #345 #242) -#351 := (and #265 #348) -#354 := (and #288 #351) -#357 := (and #311 #354) -#360 := (and #334 #357) -#364 := (iff #360 #363) -#365 := [rewrite]: #364 -#361 := (iff #203 #360) -#358 := (iff #200 #357) -#355 := (iff #197 #354) -#352 := (iff #194 #351) -#349 := (iff #189 #348) -#245 := (iff #183 #242) -#236 := (< #231 #96) -#243 := (iff #236 #242) -#244 := [rewrite]: #243 -#237 := (iff #183 #236) -#234 := (= #180 #231) -#225 := (not #224) -#228 := (ite #225 #175 #166) -#232 := (= #228 #231) -#233 := [rewrite]: #232 -#229 := (= #180 #228) -#226 := (iff #169 #225) -#227 := [rewrite]: #226 -#230 := [monotonicity #227]: #229 -#235 := [trans #230 #233]: #234 -#238 := [monotonicity #235]: #237 -#246 := [trans #238 #244]: #245 -#346 := (iff #47 #345) -#343 := (iff #46 #342) -#340 := (iff #45 #339) -#213 := (iff #44 #211) -#214 := [rewrite]: #213 -#209 := (iff #43 #208) -#210 := [rewrite]: #209 -#341 := [monotonicity #210 #214]: #340 -#218 := (iff #41 #215) -#219 := [rewrite]: #218 -#344 := [monotonicity #219 #341]: #343 -#222 := (iff #40 #221) -#223 := [rewrite]: #222 -#347 := [monotonicity #223 #344]: #346 -#350 := [monotonicity #347 #246]: #349 -#268 := (iff #163 #265) -#259 := (< #254 #96) -#266 := (iff #259 #265) -#267 := [rewrite]: #266 -#260 := (iff #163 #259) -#257 := (= #160 #254) -#248 := (not #247) -#251 := (ite #248 #155 #145) -#255 := (= #251 #254) -#256 := [rewrite]: #255 -#252 := (= #160 #251) -#249 := (iff #148 #248) -#250 := [rewrite]: #249 -#253 := [monotonicity #250]: #252 -#258 := [trans #253 #256]: #257 -#261 := [monotonicity #258]: #260 -#269 := [trans #261 #267]: #268 -#353 := [monotonicity #269 #350]: #352 -#291 := (iff #142 #288) -#282 := (< #277 #96) -#289 := (iff #282 #288) -#290 := [rewrite]: #289 -#283 := (iff #142 #282) -#280 := (= #139 #277) -#271 := (not #270) -#274 := (ite #271 #134 #124) -#278 := (= #274 #277) -#279 := [rewrite]: #278 -#275 := (= #139 #274) -#272 := (iff #127 #271) -#273 := [rewrite]: #272 -#276 := [monotonicity #273]: #275 -#281 := [trans #276 #279]: #280 -#284 := [monotonicity #281]: #283 -#292 := [trans #284 #290]: #291 -#356 := [monotonicity #292 #353]: #355 -#314 := (iff #120 #311) -#305 := (< #300 #96) -#312 := (iff #305 #311) -#313 := [rewrite]: #312 -#306 := (iff #120 #305) -#303 := (= #117 #300) -#294 := (not #293) -#297 := (ite #294 #112 #102) -#301 := (= #297 #300) -#302 := [rewrite]: #301 -#298 := (= #117 #297) -#295 := (iff #105 #294) -#296 := [rewrite]: #295 -#299 := [monotonicity #296]: #298 -#304 := [trans #299 #302]: #303 -#307 := [monotonicity #304]: #306 -#315 := [trans #307 #313]: #314 -#359 := [monotonicity #315 #356]: #358 -#337 := (iff #99 #334) -#328 := (< #323 #96) -#335 := (iff #328 #334) -#336 := [rewrite]: #335 -#329 := (iff #99 #328) -#326 := (= #92 #323) -#320 := (ite #317 #87 #77) -#324 := (= #320 #323) -#325 := [rewrite]: #324 -#321 := (= #92 #320) -#318 := (iff #80 #317) -#319 := [rewrite]: #318 -#322 := [monotonicity #319]: #321 -#327 := [trans #322 #325]: #326 -#330 := [monotonicity #327]: #329 -#338 := [trans #330 #336]: #337 -#362 := [monotonicity #338 #359]: #361 -#367 := [trans #362 #365]: #366 -#204 := (iff #52 #203) -#201 := (iff #51 #200) -#198 := (iff #50 #197) -#195 := (iff #49 #194) -#192 := (iff #48 #189) -#186 := (and #183 #47) -#190 := (iff #186 #189) -#191 := [rewrite]: #190 -#187 := (iff #48 #186) -#184 := (iff #38 #183) -#97 := (= #13 #96) -#98 := [rewrite]: #97 -#181 := (= #37 #180) -#167 := (= #34 #166) -#168 := [rewrite]: #167 -#178 := (= #36 #175) -#172 := (- #166) -#176 := (= #172 #175) -#177 := [rewrite]: #176 -#173 := (= #36 #172) -#174 := [monotonicity #168]: #173 -#179 := [trans #174 #177]: #178 -#170 := (iff #35 #169) -#171 := [monotonicity #168]: #170 -#182 := [monotonicity #171 #179 #168]: #181 -#185 := [monotonicity #182 #98]: #184 -#188 := [monotonicity #185]: #187 -#193 := [trans #188 #191]: #192 -#164 := (iff #33 #163) -#161 := (= #32 #160) -#146 := (= #29 #145) -#147 := [rewrite]: #146 -#158 := (= #31 #155) -#151 := (- #145) -#156 := (= #151 #155) -#157 := [rewrite]: #156 -#152 := (= #31 #151) -#153 := [monotonicity #147]: #152 -#159 := [trans #153 #157]: #158 -#149 := (iff #30 #148) -#150 := [monotonicity #147]: #149 -#162 := [monotonicity #150 #159 #147]: #161 -#165 := [monotonicity #162 #98]: #164 -#196 := [monotonicity #165 #193]: #195 -#143 := (iff #27 #142) -#140 := (= #26 #139) -#125 := (= #23 #124) -#126 := [rewrite]: #125 -#137 := (= #25 #134) -#130 := (- #124) -#135 := (= #130 #134) -#136 := [rewrite]: #135 -#131 := (= #25 #130) -#132 := [monotonicity #126]: #131 -#138 := [trans #132 #136]: #137 -#128 := (iff #24 #127) -#129 := [monotonicity #126]: #128 -#141 := [monotonicity #129 #138 #126]: #140 -#144 := [monotonicity #141 #98]: #143 -#199 := [monotonicity #144 #196]: #198 -#121 := (iff #20 #120) -#118 := (= #19 #117) -#103 := (= #16 #102) -#104 := [rewrite]: #103 -#115 := (= #18 #112) -#108 := (- #102) -#113 := (= #108 #112) -#114 := [rewrite]: #113 -#109 := (= #18 #108) -#110 := [monotonicity #104]: #109 -#116 := [trans #110 #114]: #115 -#106 := (iff #17 #105) -#107 := [monotonicity #104]: #106 -#119 := [monotonicity #107 #116 #104]: #118 -#122 := [monotonicity #119 #98]: #121 -#202 := [monotonicity #122 #199]: #201 -#100 := (iff #14 #99) -#93 := (= #10 #92) -#78 := (= #6 #77) -#79 := [rewrite]: #78 -#90 := (= #9 #87) -#83 := (- #77) -#88 := (= #83 #87) -#89 := [rewrite]: #88 -#84 := (= #9 #83) -#85 := [monotonicity #79]: #84 -#91 := [trans #85 #89]: #90 -#81 := (iff #8 #80) -#82 := [monotonicity #79]: #81 -#94 := [monotonicity #82 #91 #79]: #93 -#101 := [monotonicity #94 #98]: #100 -#205 := [monotonicity #101 #202]: #204 -#369 := [trans #205 #367]: #368 -#74 := [asserted]: #52 -#370 := [mp #74 #369]: #363 -#374 := [and-elim #370]: #221 -#373 := [and-elim #370]: #215 -#504 := (+ #96 #134) -#514 := (<= #504 0::real) -#635 := (not #514) -#456 := -1/3::real -#457 := (* -1/3::real uf_3) -#544 := (+ #457 #111) -#545 := (+ uf_2 #544) -#546 := (>= #545 0::real) -#390 := (+ #216 uf_9) -#593 := (+ uf_3 #390) -#603 := (<= #593 0::real) -#381 := (+ uf_8 #206) -#404 := (>= #381 0::real) -#594 := (+ uf_3 #381) -#604 := (<= #594 0::real) -#736 := (not #604) -#477 := (+ #96 #155) -#487 := (<= #477 0::real) -#733 := [hypothesis]: #604 -#564 := (+ #76 #96) -#565 := (+ uf_1 #564) -#577 := (<= #565 0::real) -#767 := (or #577 #736) -#658 := (not #577) -#673 := [hypothesis]: #658 -#478 := (+ #96 #145) -#488 := (<= #478 0::real) -#628 := (not #488) -#446 := (+ #96 #123) -#447 := (+ uf_2 #446) -#461 := (<= #447 0::real) -#618 := (not #461) -#754 := (or #224 #736) -#625 := (not #487) -#718 := [hypothesis]: #225 -#744 := (or #577 #736 #224) -#681 := (or #224 #618) -#458 := (+ #457 #123) -#459 := (+ uf_2 #458) -#460 := (>= #459 0::real) -#462 := (ite #224 #460 #461) -#467 := (not #462) -#468 := (iff #242 #467) -#465 := (iff #241 #462) -#444 := (+ #96 uf_6) -#445 := (+ #76 #444) -#448 := (ite #224 #445 #447) -#453 := (<= #448 0::real) -#463 := (iff #453 #462) -#464 := [rewrite]: #463 -#454 := (iff #241 #453) -#451 := (= #240 #448) -#439 := (ite #224 #175 #166) -#441 := (+ #96 #439) -#449 := (= #441 #448) -#450 := [rewrite]: #449 -#442 := (= #240 #441) -#437 := (= #239 #439) -#440 := [rewrite]: #437 -#443 := [monotonicity #440]: #442 -#452 := [trans #443 #450]: #451 -#455 := [monotonicity #452]: #454 -#466 := [trans #455 #464]: #465 -#469 := [monotonicity #466]: #468 -#375 := [and-elim #370]: #242 -#470 := [mp #375 #469]: #467 -#619 := (or #462 #224 #618) -#620 := [def-axiom]: #619 -#682 := [unit-resolution #620 #470]: #681 -#719 := [unit-resolution #682 #718]: #618 -#737 := (or #487 #461 #736 #577) -#372 := [and-elim #370]: #211 -#734 := [hypothesis]: #625 -#675 := [hypothesis]: #618 -#735 := [th-lemma #675 #374 #734 #372 #733 #673]: false -#738 := [lemma #735]: #737 -#739 := [unit-resolution #738 #673 #733 #719]: #487 -#740 := (or #248 #625) -#489 := (ite #247 #487 #488) -#494 := (not #489) -#495 := (iff #265 #494) -#492 := (iff #264 #489) -#479 := (ite #247 #477 #478) -#484 := (<= #479 0::real) -#490 := (iff #484 #489) -#491 := [rewrite]: #490 -#485 := (iff #264 #484) -#482 := (= #263 #479) -#471 := (ite #247 #155 #145) -#474 := (+ #96 #471) -#480 := (= #474 #479) -#481 := [rewrite]: #480 -#475 := (= #263 #474) -#472 := (= #262 #471) -#473 := [rewrite]: #472 -#476 := [monotonicity #473]: #475 -#483 := [trans #476 #481]: #482 -#486 := [monotonicity #483]: #485 -#493 := [trans #486 #491]: #492 -#496 := [monotonicity #493]: #495 -#376 := [and-elim #370]: #265 -#497 := [mp #376 #496]: #494 -#626 := (or #489 #248 #625) -#627 := [def-axiom]: #626 -#741 := [unit-resolution #627 #497]: #740 -#742 := [unit-resolution #741 #739]: #248 -#743 := [th-lemma #673 #719 #372 #733 #742 #718 #374]: false -#745 := [lemma #743]: #744 -#746 := [unit-resolution #745 #718 #733]: #577 -#727 := (or #316 #658) -#574 := (+ #76 #457) -#575 := (+ uf_1 #574) -#576 := (>= #575 0::real) -#578 := (ite #316 #576 #577) -#583 := (not #578) -#584 := (iff #334 #583) -#581 := (iff #333 #578) -#562 := (+ uf_2 #96) -#563 := (+ #86 #562) -#566 := (ite #316 #563 #565) -#571 := (<= #566 0::real) -#579 := (iff #571 #578) -#580 := [rewrite]: #579 -#572 := (iff #333 #571) -#569 := (= #332 #566) -#556 := (ite #316 #87 #77) -#559 := (+ #96 #556) -#567 := (= #559 #566) -#568 := [rewrite]: #567 -#560 := (= #332 #559) -#557 := (= #331 #556) -#558 := [rewrite]: #557 -#561 := [monotonicity #558]: #560 -#570 := [trans #561 #568]: #569 -#573 := [monotonicity #570]: #572 -#582 := [trans #573 #580]: #581 -#585 := [monotonicity #582]: #584 -#379 := [and-elim #370]: #334 -#586 := [mp #379 #585]: #583 -#659 := (or #578 #316 #658) -#660 := [def-axiom]: #659 -#728 := [unit-resolution #660 #586]: #727 -#747 := [unit-resolution #728 #746]: #316 -#748 := (not #211) -#710 := (not #221) -#749 := (or #247 #461 #710 #748 #736 #224 #317) -#750 := [th-lemma]: #749 -#751 := [unit-resolution #750 #718 #374 #719 #372 #747 #733]: #247 -#752 := [unit-resolution #741 #751]: #625 -#753 := [th-lemma #719 #372 #733 #718 #747 #752 #374]: false -#755 := [lemma #753]: #754 -#756 := [unit-resolution #755 #733]: #224 -#615 := (not #460) -#757 := (or #225 #615) -#616 := (or #462 #225 #615) -#617 := [def-axiom]: #616 -#758 := [unit-resolution #617 #470]: #757 -#759 := [unit-resolution #758 #756]: #615 -#760 := (or #618 #460 #225) -#761 := [th-lemma]: #760 -#762 := [unit-resolution #761 #759 #756]: #618 -#763 := [unit-resolution #738 #673 #733 #762]: #487 -#764 := [unit-resolution #741 #763]: #248 -#701 := (or #247 #628) -#629 := (or #489 #247 #628) -#630 := [def-axiom]: #629 -#702 := [unit-resolution #630 #497]: #701 -#765 := [unit-resolution #702 #764]: #628 -#766 := [th-lemma #756 #374 #372 #733 #764 #765 #673]: false -#768 := [lemma #766]: #767 -#769 := [unit-resolution #768 #733]: #577 -#770 := [unit-resolution #728 #769]: #316 -#771 := (or #487 #710 #748 #736 #225 #317 #460) -#772 := [th-lemma]: #771 -#773 := [unit-resolution #772 #756 #374 #759 #372 #770 #733]: #487 -#774 := (or #247 #460 #225 #710 #748 #736 #317) -#775 := [th-lemma]: #774 -#776 := [unit-resolution #775 #756 #374 #759 #372 #770 #733]: #247 -#777 := [unit-resolution #741 #776 #773]: false -#778 := [lemma #777]: #736 -#668 := (or #404 #604) -#605 := (ite #404 #603 #604) -#411 := (ite #404 #381 #390) -#419 := (* -1::real #411) -#420 := (+ uf_3 #419) -#421 := (<= #420 0::real) -#608 := (iff #421 #605) -#595 := (ite #404 #593 #594) -#600 := (<= #595 0::real) -#606 := (iff #600 #605) -#607 := [rewrite]: #606 -#601 := (iff #421 #600) -#598 := (= #420 #595) -#587 := (ite #404 #390 #381) -#590 := (+ uf_3 #587) -#596 := (= #590 #595) -#597 := [rewrite]: #596 -#591 := (= #420 #590) -#588 := (= #419 #587) -#589 := [rewrite]: #588 -#592 := [monotonicity #589]: #591 -#599 := [trans #592 #597]: #598 -#602 := [monotonicity #599]: #601 -#609 := [trans #602 #607]: #608 -#53 := (- uf_8 uf_9) -#55 := (- #53) -#54 := (< #53 0::real) -#56 := (ite #54 #55 #53) -#57 := (< #56 uf_3) -#58 := (not #57) -#434 := (iff #58 #421) -#384 := (< #381 0::real) -#395 := (ite #384 #390 #381) -#398 := (< #395 uf_3) -#401 := (not #398) -#432 := (iff #401 #421) -#422 := (not #421) -#427 := (not #422) -#430 := (iff #427 #421) -#431 := [rewrite]: #430 -#428 := (iff #401 #427) -#425 := (iff #398 #422) -#416 := (< #411 uf_3) -#423 := (iff #416 #422) -#424 := [rewrite]: #423 -#417 := (iff #398 #416) -#414 := (= #395 #411) -#405 := (not #404) -#408 := (ite #405 #390 #381) -#412 := (= #408 #411) -#413 := [rewrite]: #412 -#409 := (= #395 #408) -#406 := (iff #384 #405) -#407 := [rewrite]: #406 -#410 := [monotonicity #407]: #409 -#415 := [trans #410 #413]: #414 -#418 := [monotonicity #415]: #417 -#426 := [trans #418 #424]: #425 -#429 := [monotonicity #426]: #428 -#433 := [trans #429 #431]: #432 -#402 := (iff #58 #401) -#399 := (iff #57 #398) -#396 := (= #56 #395) -#382 := (= #53 #381) -#383 := [rewrite]: #382 -#393 := (= #55 #390) -#387 := (- #381) -#391 := (= #387 #390) -#392 := [rewrite]: #391 -#388 := (= #55 #387) -#389 := [monotonicity #383]: #388 -#394 := [trans #389 #392]: #393 -#385 := (iff #54 #384) -#386 := [monotonicity #383]: #385 -#397 := [monotonicity #386 #394 #383]: #396 -#400 := [monotonicity #397]: #399 -#403 := [monotonicity #400]: #402 -#435 := [trans #403 #433]: #434 -#380 := [asserted]: #58 -#436 := [mp #380 #435]: #421 -#610 := [mp #436 #609]: #605 -#661 := (not #605) -#666 := (or #404 #604 #661) -#667 := [def-axiom]: #666 -#669 := [unit-resolution #667 #610]: #668 -#700 := [unit-resolution #669 #778]: #404 -#664 := (or #405 #603) -#662 := (or #405 #603 #661) -#663 := [def-axiom]: #662 -#665 := [unit-resolution #663 #610]: #664 -#703 := [unit-resolution #665 #700]: #603 -#677 := (not #603) -#731 := (or #677 #546) -#648 := (not #546) -#672 := [hypothesis]: #648 -#671 := [hypothesis]: #603 -#723 := (or #224 #677 #546) -#689 := (or #461 #546 #677 #514) -#687 := [hypothesis]: #635 -#371 := [and-elim #370]: #208 -#688 := [th-lemma #373 #672 #371 #671 #675 #687]: false -#690 := [lemma #688]: #689 -#720 := [unit-resolution #690 #719 #671 #672]: #514 -#692 := (or #271 #635) -#505 := (+ #96 #124) -#515 := (<= #505 0::real) -#516 := (ite #270 #514 #515) -#521 := (not #516) -#522 := (iff #288 #521) -#519 := (iff #287 #516) -#506 := (ite #270 #504 #505) -#511 := (<= #506 0::real) -#517 := (iff #511 #516) -#518 := [rewrite]: #517 -#512 := (iff #287 #511) -#509 := (= #286 #506) -#498 := (ite #270 #134 #124) -#501 := (+ #96 #498) -#507 := (= #501 #506) -#508 := [rewrite]: #507 -#502 := (= #286 #501) -#499 := (= #285 #498) -#500 := [rewrite]: #499 -#503 := [monotonicity #500]: #502 -#510 := [trans #503 #508]: #509 -#513 := [monotonicity #510]: #512 -#520 := [trans #513 #518]: #519 -#523 := [monotonicity #520]: #522 -#377 := [and-elim #370]: #288 -#524 := [mp #377 #523]: #521 -#636 := (or #516 #271 #635) -#637 := [def-axiom]: #636 -#693 := [unit-resolution #637 #524]: #692 -#721 := [unit-resolution #693 #720]: #271 -#722 := [th-lemma #719 #373 #371 #671 #721 #718 #672]: false -#724 := [lemma #722]: #723 -#725 := [unit-resolution #724 #671 #672]: #224 -#716 := (or #225 #317 #546 #677) -#704 := [hypothesis]: #224 -#708 := [hypothesis]: #316 -#709 := (not #215) -#711 := (or #270 #709 #317 #225 #710) -#712 := [th-lemma]: #711 -#713 := [unit-resolution #712 #704 #374 #373 #708]: #270 -#714 := [unit-resolution #693 #713]: #635 -#715 := [th-lemma #708 #672 #371 #671 #714 #373 #704 #374]: false -#717 := [lemma #715]: #716 -#726 := [unit-resolution #717 #725 #672 #671]: #317 -#729 := [unit-resolution #728 #726]: #658 -#698 := (or #316 #546 #677 #577) -#674 := [hypothesis]: #317 -#685 := (or #270 #316 #577 #546 #677) -#670 := [hypothesis]: #271 -#678 := (or #461 #316 #577 #546 #677 #270) -#676 := [th-lemma #675 #674 #673 #672 #371 #671 #670 #373]: false -#679 := [lemma #676]: #678 -#680 := [unit-resolution #679 #670 #673 #672 #671 #674]: #461 -#683 := [unit-resolution #682 #680]: #224 -#684 := [th-lemma #674 #673 #672 #371 #671 #670 #683 #373]: false -#686 := [lemma #684]: #685 -#691 := [unit-resolution #686 #674 #673 #672 #671]: #270 -#694 := [unit-resolution #693 #691]: #635 -#695 := [unit-resolution #690 #694 #671 #672]: #461 -#696 := [unit-resolution #682 #695]: #224 -#697 := [th-lemma #373 #672 #371 #671 #696 #674 #673 #694]: false -#699 := [lemma #697]: #698 -#730 := [unit-resolution #699 #729 #726 #671 #672]: false -#732 := [lemma #730]: #731 -#705 := [unit-resolution #732 #703]: #546 -#706 := (or #293 #648) -#531 := (+ #96 #111) -#532 := (+ uf_2 #531) -#543 := (<= #532 0::real) -#547 := (ite #293 #543 #546) -#552 := (not #547) -#553 := (iff #311 #552) -#550 := (iff #310 #547) -#533 := (+ #96 uf_4) -#534 := (+ #76 #533) -#535 := (ite #293 #532 #534) -#540 := (<= #535 0::real) -#548 := (iff #540 #547) -#549 := [rewrite]: #548 -#541 := (iff #310 #540) -#538 := (= #309 #535) -#525 := (ite #293 #112 #102) -#528 := (+ #96 #525) -#536 := (= #528 #535) -#537 := [rewrite]: #536 -#529 := (= #309 #528) -#526 := (= #308 #525) -#527 := [rewrite]: #526 -#530 := [monotonicity #527]: #529 -#539 := [trans #530 #537]: #538 -#542 := [monotonicity #539]: #541 -#551 := [trans #542 #549]: #550 -#554 := [monotonicity #551]: #553 -#378 := [and-elim #370]: #311 -#555 := [mp #378 #554]: #552 -#649 := (or #547 #293 #648) -#650 := [def-axiom]: #649 -#707 := [unit-resolution #650 #555]: #706 -#779 := [unit-resolution #707 #705]: #293 -#783 := (or #224 #270 #461) -#780 := (not #208) -#781 := (or #294 #709 #224 #780 #677 #270 #461) -#782 := [th-lemma]: #781 -#784 := [unit-resolution #782 #373 #703 #779 #371]: #783 -#785 := [unit-resolution #784 #719 #718]: #270 -#786 := [unit-resolution #693 #785]: #635 -#787 := [th-lemma #718 #719 #786 #373 #371 #703 #779]: false -#788 := [lemma #787]: #224 -#798 := (or #270 #317 #225) -#799 := [unit-resolution #712 #374 #373]: #798 -#800 := [unit-resolution #799 #708 #788]: #270 -#801 := [unit-resolution #693 #800]: #635 -#802 := [th-lemma #708 #779 #371 #703 #788 #801 #373 #374]: false -#803 := [lemma #802]: #317 -#804 := [unit-resolution #728 #803]: #658 -#796 := (or #316 #577) -#789 := (or #514 #294 #225 #709 #780 #677 #577 #316) -#790 := [th-lemma]: #789 -#791 := [unit-resolution #790 #674 #788 #371 #779 #373 #673 #703]: #514 -#792 := (or #270 #577 #316 #294 #225 #709 #780 #677) -#793 := [th-lemma]: #792 -#794 := [unit-resolution #793 #674 #788 #371 #779 #373 #673 #703]: #270 -#795 := [unit-resolution #693 #794 #791]: false -#797 := [lemma #795]: #796 -[unit-resolution #797 #804 #803]: false -unsat diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Multivariate_Analysis/Integration.thy --- a/src/HOL/Multivariate_Analysis/Integration.thy Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Multivariate_Analysis/Integration.thy Wed May 12 23:54:04 2010 +0200 @@ -4,13 +4,16 @@ Translation from HOL light: Robert Himmelmann, TU Muenchen *) theory Integration - imports Derivative SMT + imports Derivative "~~/src/HOL/Decision_Procs/Dense_Linear_Order" begin -declare [[smt_certificates="~~/src/HOL/Multivariate_Analysis/Integration.cert"]] +declare [[smt_certificates="~~/src/HOL/Multivariate_Analysis/Integration.certs"]] declare [[smt_fixed=true]] declare [[z3_proofs=true]] +setup {* Arith_Data.add_tactic "Ferrante-Rackoff" (K FerranteRackoff.dlo_tac) *} + + subsection {* Sundries *} lemma conjunctD2: assumes "a \ b" shows a b using assms by auto diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Real.thy --- a/src/HOL/Real.thy Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Real.thy Wed May 12 23:54:04 2010 +0200 @@ -1,5 +1,8 @@ theory Real imports RComplete RealVector +uses "Tools/SMT/smt_real.ML" begin +setup {* SMT_Real.setup *} + end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/SMT.thy --- a/src/HOL/SMT.thy Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/SMT.thy Wed May 12 23:54:04 2010 +0200 @@ -8,7 +8,6 @@ imports List uses "~~/src/Tools/cache_io.ML" - ("Tools/SMT/smt_additional_facts.ML") ("Tools/SMT/smt_monomorph.ML") ("Tools/SMT/smt_normalize.ML") ("Tools/SMT/smt_translate.ML") @@ -122,12 +121,10 @@ section {* Configuration *} text {* -The current configuration can be printed by the following command -(which shows the values of most options): +The current configuration can be printed by the command +@{text smt_status}, which shows the values of most options. *} -smt_status - subsection {* General configuration options *} @@ -294,13 +291,4 @@ "x + y = y + x" by auto -lemma [z3_rule]: - "0 + (x::real) = x" - "x + 0 = x" - "0 * x = 0" - "1 * x = x" - "x + y = y + x" - by auto - - end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/SMT_Examples/ROOT.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/SMT_Examples/ROOT.ML Wed May 12 23:54:04 2010 +0200 @@ -0,0 +1,1 @@ +use_thys ["SMT_Tests", "SMT_Examples", "SMT_Word_Examples"]; diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/SMT_Examples/SMT_Examples.thy --- a/src/HOL/SMT_Examples/SMT_Examples.thy Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/SMT_Examples/SMT_Examples.thy Wed May 12 23:54:04 2010 +0200 @@ -1,22 +1,15 @@ -(* Title: HOL/SMT/SMT_Examples.thy +(* Title: HOL/SMT_Examples/SMT_Examples.thy Author: Sascha Boehme, TU Muenchen *) -header {* Examples for the 'smt' tactic. *} +header {* Examples for the SMT binding *} theory SMT_Examples -imports SMT +imports Complex_Main begin declare [[smt_solver=z3, z3_proofs=true]] - -declare [[smt_certificates="$ISABELLE_SMT/Examples/SMT_Examples.certs"]] - -text {* -To avoid re-generation of certificates, -the following option is set to "false": -*} - +declare [[smt_certificates="~~/src/HOL/SMT_Examples/SMT_Basic.certs"]] declare [[smt_fixed=true]] @@ -342,9 +335,11 @@ lemma "let P = 2 * x + 1 > x + (x::real) in P \ False \ P" by smt -lemma "x + (let y = x mod 2 in 2 * y + 1) \ x + (1::int)" by smt +lemma "x + (let y = x mod 2 in 2 * y + 1) \ x + (1::int)" + sorry (* FIXME: div/mod *) -lemma "x + (let y = x mod 2 in y + y) < x + (3::int)" by smt +lemma "x + (let y = x mod 2 in y + y) < x + (3::int)" + sorry (* FIXME: div/mod *) lemma assumes "x \ (0::real)" @@ -354,7 +349,7 @@ lemma assumes "(n + m) mod 2 = 0" and "n mod 4 = 3" shows "n mod 2 = 1 & m mod 2 = (1::int)" - using assms by smt + using assms sorry (* FIXME: div/mod *) subsection {* Linear arithmetic with quantifiers *} @@ -379,7 +374,7 @@ lemma "\x::int. \y. x < y \ y < 0 \ y >= 0" by smt -lemma "\x y::int. x < y \ (2 * x + 1) < (2 * y)" by smt +lemma "\x y::int. x < y \ (2 * x + 1) < (2 * y)" by smt lemma "\x y::int. (2 * x + 1) \ (2 * y)" by smt @@ -397,6 +392,7 @@ lemma "\u::int. \(x::int) y::real. 0 < x \ 0 < y \ -1 < x" by smt + lemma "\x::int. (\y. y \ x \ y > 0) \ x > 0" by smt lemma "\x::int. trigger [pat x] (x < a \ 2 * x < 2 * a)" by smt @@ -407,7 +403,9 @@ lemma "a > (0::int) \ a*b > 0 \ b > 0" using [[z3_proofs=false]] -- {* Isabelle's arithmetic decision procedures are too weak to automatically prove @{thm zero_less_mult_pos}. *} - by smt + by smt (* FIXME: use z3_rule *) + + lemma "(a::int) * (x + 1 + y) = a * x + a * (y + 1)" by smt @@ -442,92 +440,6 @@ lemma "prime_nat (4*m + 1) \ m \ (1::nat)" by (smt prime_nat_def) -section {* Bitvectors *} - -locale z3_bv_test -begin - -text {* -The following examples only work for Z3, and only without proof reconstruction. -*} - -declare [[smt_solver=z3, z3_proofs=false]] - - -subsection {* Bitvector arithmetic *} - -lemma "(27 :: 4 word) = -5" by smt - -lemma "(27 :: 4 word) = 11" by smt - -lemma "23 < (27::8 word)" by smt - -lemma "27 + 11 = (6::5 word)" by smt - -lemma "7 * 3 = (21::8 word)" by smt - -lemma "11 - 27 = (-16::8 word)" by smt - -lemma "- -11 = (11::5 word)" by smt - -lemma "-40 + 1 = (-39::7 word)" by smt - -lemma "a + 2 * b + c - b = (b + c) + (a :: 32 word)" by smt - -lemma "x = (5 :: 4 word) \ 4 * x = 4" by smt - - -subsection {* Bit-level logic *} - -lemma "0b110 AND 0b101 = (0b100 :: 32 word)" by smt - -lemma "0b110 OR 0b011 = (0b111 :: 8 word)" by smt - -lemma "0xF0 XOR 0xFF = (0x0F :: 8 word)" by smt - -lemma "NOT (0xF0 :: 16 word) = 0xFF0F" by smt - -lemma "word_cat (27::4 word) (27::8 word) = (2843::12 word)" by smt - -lemma "word_cat (0b0011::4 word) (0b1111::6word) = (0b0011001111 :: 10 word)" - by smt - -lemma "slice 1 (0b10110 :: 4 word) = (0b11 :: 2 word)" by smt - -lemma "ucast (0b1010 :: 4 word) = (0b1010 :: 10 word)" by smt - -lemma "scast (0b1010 :: 4 word) = (0b111010 :: 6 word)" by smt - -lemma "bv_lshr 0b10011 2 = (0b100::8 word)" by smt - -lemma "bv_ashr 0b10011 2 = (0b100::8 word)" by smt - -lemma "word_rotr 2 0b0110 = (0b1001::4 word)" by smt - -lemma "word_rotl 1 0b1110 = (0b1101::4 word)" by smt - -lemma "(x AND 0xff00) OR (x AND 0x00ff) = (x::16 word)" by smt - -lemma "w < 256 \ (w :: 16 word) AND 0x00FF = w" by smt - -end - -lemma - assumes "bv2int 0 = 0" - and "bv2int 1 = 1" - and "bv2int 2 = 2" - and "bv2int 3 = 3" - and "\x::2 word. bv2int x > 0" - shows "\i::int. i < 0 \ (\x::2 word. bv2int x > i)" - using assms - using [[smt_solver=z3]] - by smt - -lemma "P (0 \ (a :: 4 word)) = P True" - using [[smt_solver=z3, z3_proofs=false]] - by smt - - section {* Pairs *} lemma "fst (x, y) = a \ x = a" by smt @@ -546,14 +458,18 @@ lemma "i \ i1 \ i \ i2 \ ((f (i1 := v1)) (i2 := v2)) i = f i" by smt + + lemma "map (\i::nat. i + 1) [0, 1] = [1, 2]" by (smt map.simps) + lemma "(ALL x. P x) | ~ All P" by smt fun dec_10 :: "nat \ nat" where "dec_10 n = (if n < 10 then n else dec_10 (n - 10))" lemma "dec_10 (4 * dec_10 4) = 6" by (smt dec_10.simps) + axiomatization eval_dioph :: "int list \ nat list \ int" where @@ -568,19 +484,22 @@ (eval_dioph ks (map (\x. x mod 2) xs) mod 2 = l mod 2 \ eval_dioph ks (map (\x. x div 2) xs) = (l - eval_dioph ks (map (\x. x mod 2) xs)) div 2)" + sorry (* FIXME: div/mod *) +(* by (smt eval_dioph_mod[where n=2] eval_dioph_div_mult[where n=2]) +*) section {* Monomorphization examples *} -definition P :: "'a \ bool" where "P x = True" -lemma poly_P: "P x \ (P [x] \ \P[x])" by (simp add: P_def) -lemma "P (1::int)" by (smt poly_P) +definition Pred :: "'a \ bool" where "Pred x = True" +lemma poly_Pred: "Pred x \ (Pred [x] \ \Pred[x])" by (simp add: Pred_def) +lemma "Pred (1::int)" by (smt poly_Pred) -consts g :: "'a \ nat" -axioms - g1: "g (Some x) = g [x]" - g2: "g None = g []" +axiomatization g :: "'a \ nat" +axiomatization where + g1: "g (Some x) = g [x]" and + g2: "g None = g []" and g3: "g xs = length xs" lemma "g (Some (3::int)) = g (Some True)" by (smt g1 g2 g3 list.size) diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/SMT_Examples/SMT_Tests.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/SMT_Examples/SMT_Tests.thy Wed May 12 23:54:04 2010 +0200 @@ -0,0 +1,585 @@ +(* Title: HOL/SMT_Examples/SMT_Tests.thy + Author: Sascha Boehme, TU Muenchen +*) + +header {* Tests for the SMT binding *} + +theory SMT_Tests +imports Complex_Main +begin + +declare [[smt_solver=z3, z3_proofs=true]] +declare [[smt_certificates="~~/src/HOL/SMT_Examples/SMT_Tests.certs"]] +declare [[smt_fixed=true]] + + + +smt_status + + + +text {* Most examples are taken from various Isabelle theories and from HOL4. *} + + + +section {* Propositional logic *} + +lemma + "True" + "\False" + "\\True" + "True \ True" + "True \ False" + "False \ True" + "\(False \ True)" + by smt+ + +lemma + "P \ \P" + "\(P \ \P)" + "(True \ P) \ \P \ (False \ P) \ P" + "P \ P" + "P \ \ P \ False" + "P \ Q \ Q \ P" + "P \ Q \ Q \ P" + "P \ Q \ P \ Q" + "\(P \ Q) \ \P" + "\(P \ Q) \ \Q" + "\P \ \(P \ Q)" + "\Q \ \(P \ Q)" + "(P \ Q) \ (\(\P \ \Q))" + "(P \ Q) \ R \ P \ (Q \ R)" + "(P \ Q) \ R \ P \ (Q \ R)" + "(P \ Q) \ R \ (P \ R) \ (Q \ R)" + "(P \ R) \ (Q \ R) \ (P \ Q) \ R" + "(P \ Q) \ R \ (P \ R) \ (Q \ R)" + "(P \ R) \ (Q \ R) \ (P \ Q) \ R" + "((P \ Q) \ P) \ P" + "(P \ R) \ (Q \ R) \ (P \ Q \ R)" + "(P \ Q \ R) \ (P \ (Q \ R))" + "((P \ R) \ R) \ ((Q \ R) \ R) \ (P \ Q \ R) \ R" + "\(P \ R) \ \(Q \ R) \ \(P \ Q \ R)" + "(P \ Q \ R) \ (P \ Q) \ (P \ R)" + "P \ (Q \ P)" + "(P \ Q \ R) \ (P \ Q)\ (P \ R)" + "(P \ Q) \ (P \ R) \ (P \ Q \ R)" + "((((P \ Q) \ P) \ P) \ Q) \ Q" + "(P \ Q) \ (\Q \ \P)" + "(P \ Q \ R) \ (P \ Q) \ (P \ R)" + "(P \ Q) \ (Q \ P) \ (P \ Q)" + "(P \ Q) \ (Q \ P)" + "\(P \ \P)" + "(P \ Q) \ (\Q \ \P)" + "P \ P \ P \ P \ P \ P \ P \ P \ P \ P" + by smt+ + +lemma + "(if P then Q1 else Q2) \ ((P \ Q1) \ (\P \ Q2))" + "if P then (Q \ P) else (P \ Q)" + "(if P1 \ P2 then Q1 else Q2) \ (if P1 then Q1 else if P2 then Q1 else Q2)" + "(if P1 \ P2 then Q1 else Q2) \ (if P1 then if P2 then Q1 else Q2 else Q2)" + "(P1 \ (if P2 then Q1 else Q2)) \ + (if P1 \ P2 then P1 \ Q1 else P1 \ Q2)" + by smt+ + +lemma + "case P of True \ P | False \ \P" + "case \P of True \ \P | False \ P" + "case P of True \ (Q \ P) | False \ (P \ Q)" + by smt+ + + + +section {* First-order logic with equality *} + +lemma + "x = x" + "x = y \ y = x" + "x = y \ y = z \ x = z" + "x = y \ f x = f y" + "x = y \ g x y = g y x" + "f (f x) = x \ f (f (f (f (f x)))) = x \ f x = x" + "((if a then b else c) = d) = ((a \ (b = d)) \ (\ a \ (c = d)))" + by smt+ + +lemma + "distinct []" + "distinct [a]" + "distinct [a, b, c] \ a \ c" + "distinct [a, b, c] \ d = b \ a \ d" + "\ distinct [a, b, a, b]" + "a = b \ \distinct [a, b]" + "a = b \ a = c \ \distinct [a, b, c]" + "distinct [a, b, c, d] \ distinct [d, b, c, a]" + "distinct [a, b, c, d] \ distinct [a, b, c] \ distinct [b, c, d]" + by smt+ + +lemma + "\x. x = x" + "(\x. P x) \ (\y. P y)" + "\x. P x \ (\y. P x \ P y)" + "(\x. P x \ Q x) \ (\x. P x) \ (\x. Q x)" + "(\x. P x) \ R \ (\x. P x \ R)" + "(\x. P x) \ R \ (\x. P x \ R)" + "(\x y z. S x z) \ (\x z. S x z)" + "(\x y. S x y \ S y x) \ (\x. S x y) \ S y x" + "(\x. P x \ P (f x)) \ P d \ P (f(f(f(d))))" + "(\x y. s x y = s y x) \ a = a \ s a b = s b a" + "(\s. q s \ r s) \ \r s \ (\s. \r s \ \q s \ p t \ q t) \ p t \ r t" + by smt+ + +lemma + "\x. x = x" + "(\x. P x) \ (\y. P y)" + "(\x. P x \ Q x) \ (\x. P x) \ (\x. Q x)" + "(\x. P x) \ R \ (\x. P x \ R)" + "(\x y z. S x z) \ (\x z. S x z)" + "\((\x. \P x) \ ((\x. P x) \ (\x. P x \ Q x)) \ \(\x. P x))" + by smt+ + +lemma (* only without proofs: *) + "\x y. x = y" + "\x. P x \ (\y. P x \ P y)" + "(\x. P x) \ R \ (\x. P x \ R)" + "\x. P x \ P a \ P b" + "\x. (\y. P y) \ P x" + "(\x. Q \ P x) \ (Q \ (\x. P x))" + using [[z3_proofs=false, z3_options="AUTO_CONFIG=false SATURATE=true"]] + by smt+ + +lemma + "(\(\x. P x)) \ (\x. \ P x)" + "(\x. P x \ Q) \ (\x. P x) \ Q" + "(\x y. R x y = x) \ (\y. R x y) = R x c" + "\x. \y. f x y = f x (g x)" + "(if P x then \(\y. P y) else (\y. \P y)) \ P x \ P y" + "(\x y. R x y = x) \ (\x. \y. R x y) = (\x. R x c) \ (\y. R x y) = R x c" + by smt+ + +lemma (* only without proofs: *) + "(\\(\x. P x)) \ (\(\x. \ P x))" + "\u. \v. \w. \x. f u v w x = f u (g u) w (h u w)" + "\x. if x = y then (\y. y = x \ y \ x) else (\y. y = (x, x) \ y \ (x, x))" + "\x. if x = y then (\y. y = x \ y \ x) else (\y. y = (x, x) \ y \ (x, x))" + "(\x. \y. P x \ P y) \ ((\x. P x) \ (\y. P y))" + "\z. P z \ (\x. P x)" + "(\y. \x. R x y) \ (\x. \y. R x y)" + using [[z3_proofs=false]] + by smt+ + +lemma + "(\! x. P x) \ (\x. P x)" + "(\!x. P x) \ (\x. P x \ (\y. y \ x \ \P y))" + "P a \ (\x. P x \ x = a) \ (\!x. P x)" + "(\x. P x) \ (\x y. P x \ P y \ x = y) \ (\!x. P x)" + "(\!x. P x) \ (\x. P x \ (\y. P y \ y = x) \ R) \ R" + by smt+ + +lemma + "let P = True in P" + "let P = P1 \ P2 in P \ \P" + "let P1 = True; P2 = False in P1 \ P2 \ P2 \ P1" + "(let x = y in x) = y" + "(let x = y in Q x) \ (let z = y in Q z)" + "(let x = y1; z = y2 in R x z) \ (let z = y2; x = y1 in R x z)" + "(let x = y1; z = y2 in R x z) \ (let z = y1; x = y2 in R z x)" + "let P = (\x. Q x) in if P then P else \P" + by smt+ + +lemma + "distinct [a, b, c] \ (\x y. f x = f y \ y = x) \ f a \ f b" + sorry (* FIXME: injective function *) + + + +section {* Meta logical connectives *} + +lemma + "True \ True" + "False \ True" + "False \ False" + "P' x \ P' x" + "P \ P \ Q" + "Q \ P \ Q" + "\P \ P \ Q" + "Q \ P \ Q" + "\P; \Q\ \ \(P \ Q)" + "P' x \ P' x" + "P' x \ Q' x \ P' x = Q' x" + "P' x = Q' x \ P' x \ Q' x" + "x \ y \ y \ z \ x \ (z::'a::type)" + "x \ y \ (f x :: 'b::type) \ f y" + "(\x. g x) \ g a \ a" + "(\x y. h x y \ h y x) \ \x. h x x" + "(p \ q) \ \p \ q" + "(a \ b) \ (c \ d) \ (a \ b) \ (c \ d)" + by smt+ + + + +section {* Natural numbers *} + +lemma + "(0::nat) = 0" + "(1::nat) = 1" + "(0::nat) < 1" + "(0::nat) \ 1" + "(123456789::nat) < 2345678901" + by smt+ + +lemma + "Suc 0 = 1" + "Suc x = x + 1" + "x < Suc x" + "(Suc x = Suc y) = (x = y)" + "Suc (x + y) < Suc x + Suc y" + by smt+ + +lemma + "(x::nat) + 0 = x" + "0 + x = x" + "x + y = y + x" + "x + (y + z) = (x + y) + z" + "(x + y = 0) = (x = 0 \ y = 0)" + by smt+ + +lemma + "(x::nat) - 0 = x" + "x < y \ x - y = 0" + "x - y = 0 \ y - x = 0" + "(x - y) + y = (if x < y then y else x)" + "x - y - z = x - (y + z)" + by smt+ + +lemma + "(x::nat) * 0 = 0" + "0 * x = 0" + "x * 1 = x" + "1 * x = x" + "3 * x = x * 3" + by smt+ + +lemma + "(0::nat) div 0 = 0" + "(x::nat) div 0 = 0" + "(0::nat) div 1 = 0" + "(1::nat) div 1 = 1" + "(3::nat) div 1 = 3" + "(x::nat) div 1 = x" + "(0::nat) div 3 = 0" + "(1::nat) div 3 = 0" + "(3::nat) div 3 = 1" + "(x::nat) div 3 \ x" + "(x div 3 = x) = (x = 0)" + sorry (* FIXME: div/mod *) + +lemma + "(0::nat) mod 0 = 0" + "(x::nat) mod 0 = x" + "(0::nat) mod 1 = 0" + "(1::nat) mod 1 = 0" + "(3::nat) mod 1 = 0" + "(x::nat) mod 1 = 0" + "(0::nat) mod 3 = 0" + "(1::nat) mod 3 = 1" + "(3::nat) mod 3 = 0" + "x mod 3 < 3" + "(x mod 3 = x) = (x < 3)" + sorry (* FIXME: div/mod *) + +lemma + "(x::nat) = x div 1 * 1 + x mod 1" + "x = x div 3 * 3 + x mod 3" + sorry (* FIXME: div/mod *) + +lemma + "min (x::nat) y \ x" + "min x y \ y" + "min x y \ x + y" + "z < x \ z < y \ z < min x y" + "min x y = min y x" + "min x 0 = 0" + by smt+ + +lemma + "max (x::nat) y \ x" + "max x y \ y" + "max x y \ (x - y) + (y - x)" + "z > x \ z > y \ z > max x y" + "max x y = max y x" + "max x 0 = x" + by smt+ + +lemma + "0 \ (x::nat)" + "0 < x \ x \ 1 \ x = 1" + "x \ x" + "x \ y \ 3 * x \ 3 * y" + "x < y \ 3 * x < 3 * y" + "x < y \ x \ y" + "(x < y) = (x + 1 \ y)" + "\(x < x)" + "x \ y \ y \ z \ x \ z" + "x < y \ y \ z \ x \ z" + "x \ y \ y < z \ x \ z" + "x < y \ y < z \ x < z" + "x < y \ y < z \ \(z < x)" + by smt+ + + + +section {* Integers *} + +lemma + "(0::int) = 0" + "(0::int) = -0" + "(0::int) = (- 0)" + "(1::int) = 1" + "\(-1 = (1::int))" + "(0::int) < 1" + "(0::int) \ 1" + "-123 + 345 < (567::int)" + "(123456789::int) < 2345678901" + "(-123456789::int) < 2345678901" + by smt+ + +lemma + "(x::int) + 0 = x" + "0 + x = x" + "x + y = y + x" + "x + (y + z) = (x + y) + z" + "(x + y = 0) = (x = -y)" + by smt+ + +lemma + "(-1::int) = - 1" + "(-3::int) = - 3" + "-(x::int) < 0 \ x > 0" + "x > 0 \ -x < 0" + "x < 0 \ -x > 0" + by smt+ + +lemma + "(x::int) - 0 = x" + "0 - x = -x" + "x < y \ x - y < 0" + "x - y = -(y - x)" + "x - y = -y + x" + "x - y - z = x - (y + z)" + by smt+ + +lemma + "(x::int) * 0 = 0" + "0 * x = 0" + "x * 1 = x" + "1 * x = x" + "x * -1 = -x" + "-1 * x = -x" + "3 * x = x * 3" + by smt+ + +(* FIXME: consider different cases of signs + +lemma + "(0::int) div 0 = 0" + "(x::int) div 0 = 0" + "(0::int) div 1 = 0" + "(1::int) div 1 = 1" + "(3::int) div 1 = 3" + "(x::int) div 1 = x" + "(0::int) div 3 = 0" + "(1::int) div 3 = 0" + "(3::int) div 3 = 1" + "(0::int) div -3 = 0" + by smt+ + +lemma + "(0::int) mod 0 = 0" + "(x::int) mod 0 = x" + "(0::int) mod 1 = 0" + "(1::int) mod 1 = 0" + "(3::int) mod 1 = 0" + "x mod 1 = 0" + "(0::int) mod 3 = 0" + "(1::int) mod 3 = 1" + "(3::int) mod 3 = 0" + "x mod 3 < 3" + "(x mod 3 = x) = (x < 3)" + by smt+ + +lemma + "(x::int) = x div 1 * 1 + x mod 1" + "x = x div 3 * 3 + x mod 3" + by smt+ +*) + +lemma + "abs (x::int) \ 0" + "(abs x = 0) = (x = 0)" + "(x \ 0) = (abs x = x)" + "(x \ 0) = (abs x = -x)" + "abs (abs x) = abs x" + by smt+ + +lemma + "min (x::int) y \ x" + "min x y \ y" + "z < x \ z < y \ z < min x y" + "min x y = min y x" + "x \ 0 \ min x 0 = 0" + "min x y \ abs (x + y)" + by smt+ + +lemma + "max (x::int) y \ x" + "max x y \ y" + "z > x \ z > y \ z > max x y" + "max x y = max y x" + "x \ 0 \ max x 0 = x" + "max x y \ - abs x - abs y" + by smt+ + +lemma + "0 < (x::int) \ x \ 1 \ x = 1" + "x \ x" + "x \ y \ 3 * x \ 3 * y" + "x < y \ 3 * x < 3 * y" + "x < y \ x \ y" + "(x < y) = (x + 1 \ y)" + "\(x < x)" + "x \ y \ y \ z \ x \ z" + "x < y \ y \ z \ x \ z" + "x \ y \ y < z \ x \ z" + "x < y \ y < z \ x < z" + "x < y \ y < z \ \(z < x)" + by smt+ + + + +section {* Reals *} + +lemma + "(0::real) = 0" + "(0::real) = -0" + "(0::real) = (- 0)" + "(1::real) = 1" + "\(-1 = (1::real))" + "(0::real) < 1" + "(0::real) \ 1" + "-123 + 345 < (567::real)" + "(123456789::real) < 2345678901" + "(-123456789::real) < 2345678901" + by smt+ + +lemma + "(x::real) + 0 = x" + "0 + x = x" + "x + y = y + x" + "x + (y + z) = (x + y) + z" + "(x + y = 0) = (x = -y)" + by smt+ + +lemma + "(-1::int) = - 1" + "(-3::int) = - 3" + "-(x::real) < 0 \ x > 0" + "x > 0 \ -x < 0" + "x < 0 \ -x > 0" + by smt+ + +lemma + "(x::real) - 0 = x" + "0 - x = -x" + "x < y \ x - y < 0" + "x - y = -(y - x)" + "x - y = -y + x" + "x - y - z = x - (y + z)" + by smt+ + +lemma + "(x::int) * 0 = 0" + "0 * x = 0" + "x * 1 = x" + "1 * x = x" + "x * -1 = -x" + "-1 * x = -x" + "3 * x = x * 3" + by smt+ + +lemma + "(1/2 :: real) < 1" + "(1::real) / 3 = 1 / 3" + "(1::real) / -3 = - 1 / 3" + "(-1::real) / 3 = - 1 / 3" + "(-1::real) / -3 = 1 / 3" + "(x::real) / 1 = x" + "x > 0 \ x / 3 < x" + "x < 0 \ x / 3 > x" + by smt+ + +lemma + "(3::real) * (x / 3) = x" + "(x * 3) / 3 = x" + "x > 0 \ 2 * x / 3 < x" + "x < 0 \ 2 * x / 3 > x" + by smt+ + +lemma + "abs (x::real) \ 0" + "(abs x = 0) = (x = 0)" + "(x \ 0) = (abs x = x)" + "(x \ 0) = (abs x = -x)" + "abs (abs x) = abs x" + by smt+ + +lemma + "min (x::real) y \ x" + "min x y \ y" + "z < x \ z < y \ z < min x y" + "min x y = min y x" + "x \ 0 \ min x 0 = 0" + "min x y \ abs (x + y)" + by smt+ + +lemma + "max (x::real) y \ x" + "max x y \ y" + "z > x \ z > y \ z > max x y" + "max x y = max y x" + "x \ 0 \ max x 0 = x" + "max x y \ - abs x - abs y" + by smt+ + +lemma + "x \ (x::real)" + "x \ y \ 3 * x \ 3 * y" + "x < y \ 3 * x < 3 * y" + "x < y \ x \ y" + "\(x < x)" + "x \ y \ y \ z \ x \ z" + "x < y \ y \ z \ x \ z" + "x \ y \ y < z \ x \ z" + "x < y \ y < z \ x < z" + "x < y \ y < z \ \(z < x)" + by smt+ + + + +section {* Pairs *} + +lemma + "x = fst (x, y)" + "y = snd (x, y)" + "((x, y) = (y, x)) = (x = y)" + "((x, y) = (u, v)) = (x = u \ y = v)" + "(fst (x, y, z) = fst (u, v, w)) = (x = u)" + "(snd (x, y, z) = snd (u, v, w)) = (y = v \ z = w)" + "(fst (snd (x, y, z)) = fst (snd (u, v, w))) = (y = v)" + "(snd (snd (x, y, z)) = snd (snd (u, v, w))) = (z = w)" + "(fst (x, y) = snd (x, y)) = (x = y)" + "p1 = (x, y) \ p2 = (y, x) \ fst p1 = snd p2" + "(fst (x, y) = snd (x, y)) = (x = y)" + "(fst p = snd p) = (p = (snd p, fst p))" + by smt+ + +end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/SMT_Examples/SMT_Word_Examples.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/SMT_Examples/SMT_Word_Examples.thy Wed May 12 23:54:04 2010 +0200 @@ -0,0 +1,100 @@ +(* Title: HOL/SMT_Examples/SMT_Word_Examples.thy + Author: Sascha Boehme, TU Muenchen +*) + +header {* Word examples for for SMT binding *} + +theory SMT_Word_Examples +imports Word +begin + +declare [[smt_solver=z3, z3_proofs=false]] +declare [[smt_certificates="~~/src/HOL/SMT_Examples/SMT_Word_Examples.certs"]] +declare [[smt_fixed=true]] + + + +text {* +Currently, there is no proof reconstruction for words. +All lemmas are proved using the oracle mechanism. +*} + + + +section {* Bitvector numbers *} + +lemma "(27 :: 4 word) = -5" by smt + +lemma "(27 :: 4 word) = 11" by smt + +lemma "23 < (27::8 word)" by smt + +lemma "27 + 11 = (6::5 word)" by smt + +lemma "7 * 3 = (21::8 word)" by smt + +lemma "11 - 27 = (-16::8 word)" by smt + +lemma "- -11 = (11::5 word)" by smt + +lemma "-40 + 1 = (-39::7 word)" by smt + +lemma "a + 2 * b + c - b = (b + c) + (a :: 32 word)" by smt + +lemma "x = (5 :: 4 word) \ 4 * x = 4" by smt + + + +section {* Bit-level logic *} + +lemma "0b110 AND 0b101 = (0b100 :: 32 word)" by smt + +lemma "0b110 OR 0b011 = (0b111 :: 8 word)" by smt + +lemma "0xF0 XOR 0xFF = (0x0F :: 8 word)" by smt + +lemma "NOT (0xF0 :: 16 word) = 0xFF0F" by smt + +lemma "word_cat (27::4 word) (27::8 word) = (2843::12 word)" by smt + +lemma "word_cat (0b0011::4 word) (0b1111::6word) = (0b0011001111 :: 10 word)" + by smt + +lemma "slice 1 (0b10110 :: 4 word) = (0b11 :: 2 word)" by smt + +lemma "ucast (0b1010 :: 4 word) = (0b1010 :: 10 word)" by smt + +lemma "scast (0b1010 :: 4 word) = (0b111010 :: 6 word)" by smt + +lemma "0b10011 << 2 = (0b1001100::8 word)" sorry (* FIXME *) + +lemma "0b11001 >> 2 = (0b110::8 word)" sorry (* FIXME *) + +lemma "0b10011 >>> 2 = (0b100::8 word)" sorry (* FIXME *) + +lemma "word_rotr 2 0b0110 = (0b1001::4 word)" by smt + +lemma "word_rotl 1 0b1110 = (0b1101::4 word)" by smt + +lemma "(x AND 0xff00) OR (x AND 0x00ff) = (x::16 word)" by smt + +lemma "w < 256 \ (w :: 16 word) AND 0x00FF = w" by smt + + + +section {* Combined integer-bitvector properties *} + +lemma + assumes "bv2int 0 = 0" + and "bv2int 1 = 1" + and "bv2int 2 = 2" + and "bv2int 3 = 3" + and "\x::2 word. bv2int x > 0" + shows "\i::int. i < 0 \ (\x::2 word. bv2int x > i)" + using assms + using [[z3_options="AUTO_CONFIG=false"]] + by smt + +lemma "P (0 \ (a :: 4 word)) = P True" by smt + +end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/cvc3_solver.ML --- a/src/HOL/Tools/SMT/cvc3_solver.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/cvc3_solver.ML Wed May 12 23:54:04 2010 +0200 @@ -35,7 +35,7 @@ else raise SMT_Solver.SMT (solver_name ^ " failed") end -fun smtlib_solver oracle _ = { +fun solver oracle _ = { command = {env_var=env_var, remote_name=SOME solver_name}, arguments = options, interface = SMTLIB_Interface.interface, @@ -43,6 +43,6 @@ val setup = Thm.add_oracle (Binding.name solver_name, core_oracle) #-> (fn (_, oracle) => - SMT_Solver.add_solver (solver_name, smtlib_solver oracle)) + Context.theory_map (SMT_Solver.add_solver (solver_name, solver oracle))) end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/smt_normalize.ML --- a/src/HOL/Tools/SMT/smt_normalize.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/smt_normalize.ML Wed May 12 23:54:04 2010 +0200 @@ -18,6 +18,7 @@ type extra_norm = thm list -> Proof.context -> thm list * Proof.context val normalize: extra_norm -> thm list -> Proof.context -> thm list * Proof.context + val atomize_conv: Proof.context -> conv val eta_expand_conv: (Proof.context -> conv) -> Proof.context -> conv end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/smt_real.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Tools/SMT/smt_real.ML Wed May 12 23:54:04 2010 +0200 @@ -0,0 +1,146 @@ +(* Title: HOL/Tools/SMT/smt_real.ML + Author: Sascha Boehme, TU Muenchen + +SMT setup for reals. +*) + +signature SMT_REAL = +sig + val setup: theory -> theory +end + +structure SMT_Real: SMT_REAL = +struct + + +(* SMT-LIB logic *) + +fun smtlib_logic ts = + if exists (Term.exists_type (Term.exists_subtype (equal @{typ real}))) ts + then SOME "AUFLIRA" + else NONE + + + +(* SMT-LIB builtins *) + +local + fun smtlib_builtin_typ @{typ real} = SOME "Real" + | smtlib_builtin_typ _ = NONE + + fun smtlib_builtin_num @{typ real} i = SOME (string_of_int i ^ ".0") + | smtlib_builtin_num _ _ = NONE + + fun smtlib_builtin_func @{const_name uminus} ts = SOME ("~", ts) + | smtlib_builtin_func @{const_name plus} ts = SOME ("+", ts) + | smtlib_builtin_func @{const_name minus} ts = SOME ("-", ts) + | smtlib_builtin_func @{const_name times} ts = SOME ("*", ts) + | smtlib_builtin_func _ _ = NONE + + fun smtlib_builtin_pred @{const_name less} = SOME "<" + | smtlib_builtin_pred @{const_name less_eq} = SOME "<=" + | smtlib_builtin_pred _ = NONE + + fun real_fun T y f x = + (case try Term.domain_type T of + SOME @{typ real} => f x + | _ => y) +in + +val smtlib_builtins = { + builtin_typ = smtlib_builtin_typ, + builtin_num = smtlib_builtin_num, + builtin_func = (fn (n, T) => real_fun T NONE (smtlib_builtin_func n)), + builtin_pred = (fn (n, T) => fn ts => + real_fun T NONE smtlib_builtin_pred n |> Option.map (rpair ts)), + is_builtin_pred = (fn n => fn T => + real_fun T false (is_some o smtlib_builtin_pred) n) } + +end + + + +(* Z3 builtins *) + +local + fun z3_builtin_fun @{term "op / :: real => _"} ts = SOME ("/", ts) + | z3_builtin_fun _ _ = NONE +in + +val z3_builtins = (fn c => fn ts => z3_builtin_fun (Const c) ts) + +end + + + +(* Z3 constructors *) + +local + structure I = Z3_Interface + + fun z3_mk_builtin_typ (I.Sym ("real", _)) = SOME @{typ real} + | z3_mk_builtin_typ _ = NONE + + fun z3_mk_builtin_num _ i T = + if T = @{typ real} then SOME (Numeral.mk_cnumber @{ctyp real} i) + else NONE + + val mk_uminus = Thm.capply @{cterm "uminus :: real => _"} + val mk_add = Thm.mk_binop @{cterm "op + :: real => _"} + val mk_sub = Thm.mk_binop @{cterm "op - :: real => _"} + val mk_mul = Thm.mk_binop @{cterm "op * :: real => _"} + val mk_div = Thm.mk_binop @{cterm "op / :: real => _"} + val mk_lt = Thm.mk_binop @{cterm "op < :: real => _"} + val mk_le = Thm.mk_binop @{cterm "op <= :: real => _"} + + fun z3_mk_builtin_fun (I.Sym ("-", _)) [ct] = SOME (mk_uminus ct) + | z3_mk_builtin_fun (I.Sym ("+", _)) [ct, cu] = SOME (mk_add ct cu) + | z3_mk_builtin_fun (I.Sym ("-", _)) [ct, cu] = SOME (mk_sub ct cu) + | z3_mk_builtin_fun (I.Sym ("*", _)) [ct, cu] = SOME (mk_mul ct cu) + | z3_mk_builtin_fun (I.Sym ("/", _)) [ct, cu] = SOME (mk_div ct cu) + | z3_mk_builtin_fun (I.Sym ("<", _)) [ct, cu] = SOME (mk_lt ct cu) + | z3_mk_builtin_fun (I.Sym ("<=", _)) [ct, cu] = SOME (mk_le ct cu) + | z3_mk_builtin_fun (I.Sym (">", _)) [ct, cu] = SOME (mk_lt cu ct) + | z3_mk_builtin_fun (I.Sym (">=", _)) [ct, cu] = SOME (mk_le cu ct) + | z3_mk_builtin_fun _ _ = NONE +in + +val z3_mk_builtins = { + mk_builtin_typ = z3_mk_builtin_typ, + mk_builtin_num = z3_mk_builtin_num, + mk_builtin_fun = (fn _ => fn sym => fn cts => + (case try (#T o Thm.rep_cterm o hd) cts of + SOME @{typ real} => z3_mk_builtin_fun sym cts + | _ => NONE)) } + +end + + + +(* Z3 proof reconstruction *) + +val real_rules = @{lemma + "0 + (x::real) = x" + "x + 0 = x" + "0 * x = 0" + "1 * x = x" + "x + y = y + x" + by auto} + +val real_linarith_proc = Simplifier.simproc @{theory} "fast_real_arith" [ + "(m::real) < n", "(m::real) <= n", "(m::real) = n"] (K Lin_Arith.simproc) + + + +(* setup *) + +val setup = + Context.theory_map ( + SMTLIB_Interface.add_logic smtlib_logic #> + SMTLIB_Interface.add_builtins smtlib_builtins #> + Z3_Interface.add_builtin_funs z3_builtins #> + Z3_Interface.add_mk_builtins z3_mk_builtins #> + fold Z3_Proof_Reconstruction.add_z3_rule real_rules #> + Z3_Proof_Tools.add_simproc real_linarith_proc) + +end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/smt_solver.ML --- a/src/HOL/Tools/SMT/smt_solver.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/smt_solver.ML Wed May 12 23:54:04 2010 +0200 @@ -32,10 +32,11 @@ (*solvers*) type solver = Proof.context -> thm list -> thm type solver_info = Context.generic -> Pretty.T list - val add_solver: string * (Proof.context -> solver_config) -> theory -> - theory - val all_solver_names_of: theory -> string list - val add_solver_info: string * solver_info -> theory -> theory + val add_solver: string * (Proof.context -> solver_config) -> + Context.generic -> Context.generic + val all_solver_names_of: Context.generic -> string list + val add_solver_info: string * solver_info -> Context.generic -> + Context.generic val solver_name_of: Context.generic -> string val select_solver: string -> Context.generic -> Context.generic val solver_of: Context.generic -> solver @@ -211,7 +212,7 @@ type solver = Proof.context -> thm list -> thm type solver_info = Context.generic -> Pretty.T list -structure Solvers = Theory_Data +structure Solvers = Generic_Data ( type T = ((Proof.context -> solver_config) * solver_info) Symtab.table val empty = Symtab.empty @@ -241,12 +242,12 @@ val solver_name_of = Selected_Solver.get fun select_solver name context = - if is_none (lookup_solver (Context.theory_of context) name) + if is_none (lookup_solver context name) then error ("SMT solver not registered: " ^ quote name) else Selected_Solver.map (K name) context fun raw_solver_of context name = - (case lookup_solver (Context.theory_of context) name of + (case lookup_solver context name of NONE => error "No SMT solver selected" | SOME (s, _) => s) @@ -285,8 +286,9 @@ | _ => false)) in fun smt_tac' pass_exns ctxt rules = - Tactic.rtac @{thm ccontr} THEN' - SUBPROOF (fn {context, prems, ...} => + CONVERSION (SMT_Normalize.atomize_conv ctxt) + THEN' Tactic.rtac @{thm ccontr} + THEN' SUBPROOF (fn {context, prems, ...} => let val thms = rules @ prems in if exists (has_topsort o Thm.prop_of) thms @@ -323,27 +325,27 @@ "Applies an SMT solver to the current goal." -fun print_setup gen = +fun print_setup context = let - val t = string_of_int (Config.get_generic gen timeout) - val names = sort_strings (all_solver_names_of (Context.theory_of gen)) + val t = string_of_int (Config.get_generic context timeout) + val names = sort_strings (all_solver_names_of context) val ns = if null names then [no_solver] else names val take_info = (fn (_, []) => NONE | info => SOME info) val infos = - Context.theory_of gen - |> Symtab.dest o Solvers.get - |> map_filter (fn (n, (_, info)) => take_info (n, info gen)) + Solvers.get context + |> Symtab.dest + |> map_filter (fn (n, (_, info)) => take_info (n, info context)) |> sort (prod_ord string_ord (K EQUAL)) |> map (fn (n, ps) => Pretty.big_list (n ^ ":") ps) val certs_filename = - (case get_certificates_path gen of + (case get_certificates_path context of SOME path => Path.implode path | NONE => "(disabled)") - val fixed = if Config.get_generic gen fixed_certificates then "true" + val fixed = if Config.get_generic context fixed_certificates then "true" else "false" in Pretty.writeln (Pretty.big_list "SMT setup:" [ - Pretty.str ("Current SMT solver: " ^ solver_name_of gen), + Pretty.str ("Current SMT solver: " ^ solver_name_of context), Pretty.str_list "Available SMT solvers: " "" ns, Pretty.str ("Current timeout: " ^ t ^ " seconds"), Pretty.str ("Certificates cache: " ^ certs_filename), diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/smt_translate.ML --- a/src/HOL/Tools/SMT/smt_translate.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/smt_translate.ML Wed May 12 23:54:04 2010 +0200 @@ -17,21 +17,23 @@ (* configuration options *) type prefixes = {sort_prefix: string, func_prefix: string} + type header = Proof.context -> term list -> string list type strict = { is_builtin_conn: string * typ -> bool, - is_builtin_pred: string * typ -> bool, + is_builtin_pred: Proof.context -> string * typ -> bool, is_builtin_distinct: bool} type builtins = { - builtin_typ: typ -> string option, - builtin_num: typ -> int -> string option, - builtin_fun: string * typ -> term list -> (string * term list) option } - datatype smt_theory = Integer | Real | Bitvector + builtin_typ: Proof.context -> typ -> string option, + builtin_num: Proof.context -> typ -> int -> string option, + builtin_fun: Proof.context -> string * typ -> term list -> + (string * term list) option } type sign = { - theories: smt_theory list, + header: string list, sorts: string list, funcs: (string * (string list * string)) list } type config = { prefixes: prefixes, + header: header, strict: strict option, builtins: builtins, serialize: string list -> sign -> sterm list -> string } @@ -39,7 +41,7 @@ typs: typ Symtab.table, terms: term Symtab.table, unfolds: thm list, - assms: thm list option } + assms: thm list } val translate: config -> Proof.context -> string list -> thm list -> string * recon @@ -66,25 +68,27 @@ type prefixes = {sort_prefix: string, func_prefix: string} +type header = Proof.context -> term list -> string list + type strict = { is_builtin_conn: string * typ -> bool, - is_builtin_pred: string * typ -> bool, + is_builtin_pred: Proof.context -> string * typ -> bool, is_builtin_distinct: bool} type builtins = { - builtin_typ: typ -> string option, - builtin_num: typ -> int -> string option, - builtin_fun: string * typ -> term list -> (string * term list) option } - -datatype smt_theory = Integer | Real | Bitvector + builtin_typ: Proof.context -> typ -> string option, + builtin_num: Proof.context -> typ -> int -> string option, + builtin_fun: Proof.context -> string * typ -> term list -> + (string * term list) option } type sign = { - theories: smt_theory list, + header: string list, sorts: string list, funcs: (string * (string list * string)) list } type config = { prefixes: prefixes, + header: header, strict: strict option, builtins: builtins, serialize: string list -> sign -> sterm list -> string } @@ -93,7 +97,7 @@ typs: typ Symtab.table, terms: term Symtab.table, unfolds: thm list, - assms: thm list option } + assms: thm list } @@ -175,7 +179,6 @@ fun strictify {is_builtin_conn, is_builtin_pred, is_builtin_distinct} ctxt = let - fun is_builtin_conn' (@{const_name True}, _) = false | is_builtin_conn' (@{const_name False}, _) = false | is_builtin_conn' c = is_builtin_conn c @@ -199,7 +202,7 @@ (c as Const (@{const_name If}, _), [t1, t2, t3]) => c $ in_form t1 $ in_term t2 $ in_term t3 | (h as Const c, ts) => - if is_builtin_conn' (conn c) orelse is_builtin_pred (pred c) + if is_builtin_conn' (conn c) orelse is_builtin_pred ctxt (pred c) then wrap_in_if (in_form t) else Term.list_comb (h, map in_term ts) | (h as Free _, ts) => Term.list_comb (h, map in_term ts) @@ -227,7 +230,7 @@ | (Const c, ts) => if is_builtin_conn (conn c) then Term.list_comb (Const (conn c), map in_form ts) - else if is_builtin_pred (pred c) + else if is_builtin_pred ctxt (pred c) then Term.list_comb (Const (pred c), map in_term ts) else as_term (in_term t) | _ => as_term (in_term t)) @@ -240,62 +243,53 @@ (* translation from Isabelle terms into SMT intermediate terms *) -val empty_context = (1, Typtab.empty, 1, Termtab.empty, []) +val empty_context = (1, Typtab.empty, 1, Termtab.empty) -fun make_sign (_, typs, _, terms, thys) = { - theories = thys, +fun make_sign header (_, typs, _, terms) = { + header = header, sorts = Typtab.fold (cons o snd) typs [], funcs = Termtab.fold (cons o snd) terms [] } -fun make_recon (unfolds, assms) (_, typs, _, terms, _) = { +fun make_recon (unfolds, assms) (_, typs, _, terms) = { typs = Symtab.make (map swap (Typtab.dest typs)), terms = Symtab.make (map (fn (t, (n, _)) => (n, t)) (Termtab.dest terms)), unfolds = unfolds, - assms = SOME assms } + assms = assms } fun string_of_index pre i = pre ^ string_of_int i -fun add_theory T (Tidx, typs, idx, terms, thys) = - let - fun add @{typ int} = insert (op =) Integer - | add @{typ real} = insert (op =) Real - | add (Type (@{type_name word}, _)) = insert (op =) Bitvector - | add (Type (_, Ts)) = fold add Ts - | add _ = I - in (Tidx, typs, idx, terms, add T thys) end - -fun fresh_typ sort_prefix T (cx as (Tidx, typs, idx, terms, thys)) = +fun fresh_typ sort_prefix T (cx as (Tidx, typs, idx, terms)) = (case Typtab.lookup typs T of SOME s => (s, cx) | NONE => let val s = string_of_index sort_prefix Tidx val typs' = Typtab.update (T, s) typs - in (s, (Tidx+1, typs', idx, terms, thys)) end) + in (s, (Tidx+1, typs', idx, terms)) end) -fun fresh_fun func_prefix t ss (cx as (Tidx, typs, idx, terms, thys)) = +fun fresh_fun func_prefix t ss (cx as (Tidx, typs, idx, terms)) = (case Termtab.lookup terms t of SOME (f, _) => (f, cx) | NONE => let val f = string_of_index func_prefix idx val terms' = Termtab.update (revert_types t, (f, ss)) terms - in (f, (Tidx, typs, idx+1, terms', thys)) end) + in (f, (Tidx, typs, idx+1, terms')) end) fun relaxed thms = (([], thms), map prop_of thms) -fun with_context f (ths, ts) = +fun with_context header f (ths, ts) = let val (us, context) = fold_map f ts empty_context - in ((make_sign context, us), make_recon ths context) end + in ((make_sign (header ts) context, us), make_recon ths context) end -fun translate {prefixes, strict, builtins, serialize} ctxt comments = +fun translate {prefixes, strict, header, builtins, serialize} ctxt comments = let val {sort_prefix, func_prefix} = prefixes val {builtin_typ, builtin_num, builtin_fun} = builtins - fun transT T = add_theory T #> - (case builtin_typ T of + fun transT T = + (case builtin_typ ctxt T of SOME n => pair n | NONE => fresh_typ sort_prefix T) @@ -313,18 +307,18 @@ transT T ##>> trans t1 ##>> trans t2 #>> (fn ((U, u1), u2) => SLet (U, u1, u2)) | (h as Const (c as (@{const_name distinct}, T)), [t1]) => - (case builtin_fun c (HOLogic.dest_list t1) of - SOME (n, ts) => add_theory T #> fold_map trans ts #>> app n + (case builtin_fun ctxt c (HOLogic.dest_list t1) of + SOME (n, ts) => fold_map trans ts #>> app n | NONE => transs h T [t1]) | (h as Const (c as (_, T)), ts) => (case try HOLogic.dest_number t of SOME (T, i) => - (case builtin_num T i of - SOME n => add_theory T #> pair (SApp (n, [])) + (case builtin_num ctxt T i of + SOME n => pair (SApp (n, [])) | NONE => transs t T []) | NONE => - (case builtin_fun c ts of - SOME (n, ts') => add_theory T #> fold_map trans ts' #>> app n + (case builtin_fun ctxt c ts of + SOME (n, ts') => fold_map trans ts' #>> app n | NONE => transs h T ts)) | (h as Free (_, T), ts) => transs h T ts | (Bound i, []) => pair (SVar i) @@ -337,8 +331,8 @@ fresh_fun func_prefix t Up ##>> fold_map trans ts #>> SApp) end in - (if is_some strict then strictify (the strict) ctxt else relaxed) #> - with_context trans #>> uncurry (serialize comments) + (case strict of SOME strct => strictify strct ctxt | NONE => relaxed) #> + with_context (header ctxt) trans #>> uncurry (serialize comments) end end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/smt_word.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Tools/SMT/smt_word.ML Wed May 12 23:54:04 2010 +0200 @@ -0,0 +1,143 @@ +(* Title: HOL/Tools/SMT/smt_word.ML + Author: Sascha Boehme, TU Muenchen + +SMT setup for words. +*) + +signature SMT_WORD = +sig + val setup: theory -> theory +end + +structure SMT_Word: SMT_WORD = +struct + + +(* utilities *) + +fun dest_binT T = + (case T of + Type (@{type_name "Numeral_Type.num0"}, _) => 0 + | Type (@{type_name "Numeral_Type.num1"}, _) => 1 + | Type (@{type_name "Numeral_Type.bit0"}, [T]) => 2 * dest_binT T + | Type (@{type_name "Numeral_Type.bit1"}, [T]) => 1 + 2 * dest_binT T + | _ => raise TYPE ("dest_binT", [T], [])) + +fun is_wordT (Type (@{type_name word}, _)) = true + | is_wordT _ = false + +fun dest_wordT (Type (@{type_name word}, [T])) = dest_binT T + | dest_wordT T = raise TYPE ("dest_wordT", [T], []) + + + +(* SMT-LIB logic *) + +fun smtlib_logic ts = + if exists (Term.exists_type (Term.exists_subtype is_wordT)) ts + then SOME "QF_AUFBV" + else NONE + + + +(* SMT-LIB builtins *) + +local + fun index1 n i = n ^ "[" ^ string_of_int i ^ "]" + fun index2 n i j = n ^ "[" ^ string_of_int i ^ ":" ^ string_of_int j ^ "]" + + fun smtlib_builtin_typ (Type (@{type_name word}, [T])) = + Option.map (index1 "BitVec") (try dest_binT T) + | smtlib_builtin_typ _ = NONE + + fun smtlib_builtin_num (Type (@{type_name word}, [T])) i = + Option.map (index1 ("bv" ^ string_of_int i)) (try dest_binT T) + | smtlib_builtin_num _ _ = NONE + + fun if_fixed n T ts = + let val (Ts, T) = Term.strip_type T + in if forall (can dest_wordT) (T :: Ts) then SOME (n, ts) else NONE end + + fun dest_word_funT (Type ("fun", [T, U])) = (dest_wordT T, dest_wordT U) + | dest_word_funT T = raise TYPE ("dest_word_funT", [T], []) + fun dest_nat (@{term nat} $ n :: ts) = (snd (HOLogic.dest_number n), ts) + | dest_nat ts = raise TERM ("dest_nat", ts) + fun dest_nat_word_funT (T, ts) = + (dest_word_funT (Term.range_type T), dest_nat ts) + + fun shift n T ts = + let val U = Term.domain_type T + in + (case (can dest_wordT U, ts) of + (true, [t, u]) => + (case try HOLogic.dest_number u of + SOME (_,i) => SOME (n, [t, HOLogic.mk_number U i]) + | NONE => NONE) (* FIXME: also support non-numerical shifts *) + | _ => NONE) + end + + fun extend n T ts = + (case try dest_word_funT T of + SOME (i, j) => if j-i >= 0 then SOME (index1 n (j-i), ts) else NONE + | _ => NONE) + + fun rotate n T ts = + try dest_nat ts + |> Option.map (fn (i, ts') => (index1 n i, ts')) + + fun extract n T ts = + try dest_nat_word_funT (T, ts) + |> Option.map (fn ((_, i), (lb, ts')) => (index2 n (i + lb - 1) lb, ts')) + + fun smtlib_builtin_func @{const_name uminus} = if_fixed "bvneg" + | smtlib_builtin_func @{const_name plus} = if_fixed "bvadd" + | smtlib_builtin_func @{const_name minus} = if_fixed "bvsub" + | smtlib_builtin_func @{const_name times} = if_fixed "bvmul" + | smtlib_builtin_func @{const_name bitNOT} = if_fixed "bvnot" + | smtlib_builtin_func @{const_name bitAND} = if_fixed "bvand" + | smtlib_builtin_func @{const_name bitOR} = if_fixed "bvor" + | smtlib_builtin_func @{const_name bitXOR} = if_fixed "bvxor" + | smtlib_builtin_func @{const_name word_cat} = if_fixed "concat" + | smtlib_builtin_func @{const_name shiftl} = shift "bvshl" + | smtlib_builtin_func @{const_name shiftr} = shift "bvlshr" + | smtlib_builtin_func @{const_name sshiftr} = shift "bvashr" + | smtlib_builtin_func @{const_name slice} = extract "extract" + | smtlib_builtin_func @{const_name ucast} = extend "zero_extend" + | smtlib_builtin_func @{const_name scast} = extend "sign_extend" + | smtlib_builtin_func @{const_name word_rotl} = rotate "rotate_left" + | smtlib_builtin_func @{const_name word_rotr} = rotate "rotate_right" + | smtlib_builtin_func _ = (fn _ => K NONE) + (* FIXME: support more builtin bitvector functions: + bvudiv/bvurem and bvsdiv/bvsmod/bvsrem *) + + fun smtlib_builtin_pred @{const_name less} = SOME "bvult" + | smtlib_builtin_pred @{const_name less_eq} = SOME "bvule" + | smtlib_builtin_pred @{const_name word_sless} = SOME "bvslt" + | smtlib_builtin_pred @{const_name word_sle} = SOME "bvsle" + | smtlib_builtin_pred _ = NONE + + fun smtlib_builtin_pred' (n, T) = + if can (dest_wordT o Term.domain_type) T then smtlib_builtin_pred n + else NONE +in + +val smtlib_builtins = { + builtin_typ = smtlib_builtin_typ, + builtin_num = smtlib_builtin_num, + builtin_func = (fn (n, T) => fn ts => smtlib_builtin_func n T ts), + builtin_pred = (fn c => fn ts => + smtlib_builtin_pred' c |> Option.map (rpair ts)), + is_builtin_pred = curry (is_some o smtlib_builtin_pred') } + +end + + + +(* setup *) + +val setup = + Context.theory_map ( + SMTLIB_Interface.add_logic smtlib_logic #> + SMTLIB_Interface.add_builtins smtlib_builtins) + +end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/smtlib_interface.ML --- a/src/HOL/Tools/SMT/smtlib_interface.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/smtlib_interface.ML Wed May 12 23:54:04 2010 +0200 @@ -6,6 +6,15 @@ signature SMTLIB_INTERFACE = sig + type builtins = { + builtin_typ: typ -> string option, + builtin_num: typ -> int -> string option, + builtin_func: string * typ -> term list -> (string * term list) option, + builtin_pred: string * typ -> term list -> (string * term list) option, + is_builtin_pred: string -> typ -> bool } + val add_builtins: builtins -> Context.generic -> Context.generic + val add_logic: (term list -> string option) -> Context.generic -> + Context.generic val interface: SMT_Solver.interface end @@ -89,67 +98,63 @@ (** builtins **) -fun dest_binT T = - (case T of - Type (@{type_name "Numeral_Type.num0"}, _) => 0 - | Type (@{type_name "Numeral_Type.num1"}, _) => 1 - | Type (@{type_name "Numeral_Type.bit0"}, [T]) => 2 * dest_binT T - | Type (@{type_name "Numeral_Type.bit1"}, [T]) => 1 + 2 * dest_binT T - | _ => raise TYPE ("dest_binT", [T], [])) +(* additional builtins *) -fun dest_wordT (Type (@{type_name word}, [T])) = dest_binT T - | dest_wordT T = raise TYPE ("dest_wordT", [T], []) +type builtins = { + builtin_typ: typ -> string option, + builtin_num: typ -> int -> string option, + builtin_func: string * typ -> term list -> (string * term list) option, + builtin_pred: string * typ -> term list -> (string * term list) option, + is_builtin_pred: string -> typ -> bool } -fun index1 n i = n ^ "[" ^ string_of_int i ^ "]" -fun index2 n i j = n ^ "[" ^ string_of_int i ^ ":" ^ string_of_int j ^ "]" +fun chained _ [] = NONE + | chained f (b :: bs) = (case f b of SOME y => SOME y | NONE => chained f bs) -fun builtin_typ @{typ int} = SOME "Int" - | builtin_typ @{typ real} = SOME "Real" - | builtin_typ (Type (@{type_name word}, [T])) = - Option.map (index1 "BitVec") (try dest_binT T) - | builtin_typ _ = NONE +fun chained' _ [] = false + | chained' f (b :: bs) = f b orelse chained' f bs + +fun chained_builtin_typ bs T = + chained (fn {builtin_typ, ...} : builtins => builtin_typ T) bs -fun builtin_num @{typ int} i = SOME (string_of_int i) - | builtin_num @{typ real} i = SOME (string_of_int i ^ ".0") - | builtin_num (Type (@{type_name word}, [T])) i = - Option.map (index1 ("bv" ^ string_of_int i)) (try dest_binT T) - | builtin_num _ _ = NONE +fun chained_builtin_num bs T i = + chained (fn {builtin_num, ...} : builtins => builtin_num T i) bs -val is_propT = (fn @{typ prop} => true | _ => false) -fun is_connT T = Term.strip_type T |> (fn (Us, U) => forall is_propT (U :: Us)) -fun is_predT T = is_propT (Term.body_type T) +fun chained_builtin_func bs c ts = + chained (fn {builtin_func, ...} : builtins => builtin_func c ts) bs + +fun chained_builtin_pred bs c ts = + chained (fn {builtin_pred, ...} : builtins => builtin_pred c ts) bs -fun just c ts = SOME (c, ts) +fun chained_is_builtin_pred bs n T = + chained' (fn {is_builtin_pred, ...} : builtins => is_builtin_pred n T) bs -val is_arith_type = member (op =) [@{typ int}, @{typ real}] o Term.domain_type +fun fst_int_ord ((s1, _), (s2, _)) = int_ord (s1, s2) -fun fixed_bvT (Ts, T) x = - if forall (can dest_wordT) (T :: Ts) then SOME x else NONE +structure Builtins = Generic_Data +( + type T = (int * builtins) list + val empty = [] + val extend = I + fun merge (bs1, bs2) = OrdList.union fst_int_ord bs2 bs1 +) -fun if_fixed_bvT' T = fixed_bvT ([], Term.domain_type T) -fun if_fixed_bvT T = curry (fixed_bvT ([], Term.domain_type T)) -fun if_full_fixed_bvT T = curry (fixed_bvT (Term.strip_type T)) +fun add_builtins bs = Builtins.map (OrdList.insert fst_int_ord (serial (), bs)) -fun dest_word_funT (Type ("fun", [T, U])) = (dest_wordT T, dest_wordT U) - | dest_word_funT T = raise TYPE ("dest_word_funT", [T], []) -fun dest_nat (@{term nat} $ n :: ts) = (snd (HOLogic.dest_number n), ts) - | dest_nat ts = raise TERM ("dest_nat", ts) -fun dest_nat_word_funT (T, ts) = - (dest_word_funT (Term.range_type T), dest_nat ts) +fun get_builtins ctxt = map snd (Builtins.get (Context.Proof ctxt)) + + +(* basic builtins combined with additional builtins *) + +fun builtin_typ _ @{typ int} = SOME "Int" + | builtin_typ ctxt T = chained_builtin_typ (get_builtins ctxt) T -fun bv_extend n T ts = - (case try dest_word_funT T of - SOME (i, j) => if j-i >= 0 then SOME (index1 n (j-i), ts) else NONE - | _ => NONE) +fun builtin_num _ @{typ int} i = SOME (string_of_int i) + | builtin_num ctxt T i = chained_builtin_num (get_builtins ctxt) T i -fun bv_rotate n T ts = - try dest_nat ts - |> Option.map (fn (i, ts') => (index1 n i, ts')) - -fun bv_extract n T ts = - try dest_nat_word_funT (T, ts) - |> Option.map (fn ((_, i), (lb, ts')) => (index2 n (i + lb - 1) lb, ts')) - +fun if_int_type T n = + (case try Term.domain_type T of + SOME @{typ int} => SOME n + | _ => NONE) fun conn @{const_name True} = SOME "true" | conn @{const_name False} = SOME "false" @@ -164,61 +169,62 @@ fun pred @{const_name distinct} _ = SOME "distinct" | pred @{const_name "op ="} _ = SOME "=" | pred @{const_name term_eq} _ = SOME "=" - | pred @{const_name less} T = - if is_arith_type T then SOME "<" - else if_fixed_bvT' T "bvult" - | pred @{const_name less_eq} T = - if is_arith_type T then SOME "<=" - else if_fixed_bvT' T "bvule" - | pred @{const_name word_sless} T = if_fixed_bvT' T "bvslt" - | pred @{const_name word_sle} T = if_fixed_bvT' T "bvsle" + | pred @{const_name less} T = if_int_type T "<" + | pred @{const_name less_eq} T = if_int_type T "<=" | pred _ _ = NONE -fun func @{const_name If} _ = just "ite" - | func @{const_name uminus} T = - if is_arith_type T then just "~" - else if_fixed_bvT T "bvneg" - | func @{const_name plus} T = - if is_arith_type T then just "+" - else if_fixed_bvT T "bvadd" - | func @{const_name minus} T = - if is_arith_type T then just "-" - else if_fixed_bvT T "bvsub" - | func @{const_name times} T = - if is_arith_type T then just "*" - else if_fixed_bvT T "bvmul" - | func @{const_name bitNOT} T = if_fixed_bvT T "bvnot" - | func @{const_name bitAND} T = if_fixed_bvT T "bvand" - | func @{const_name bitOR} T = if_fixed_bvT T "bvor" - | func @{const_name bitXOR} T = if_fixed_bvT T "bvxor" - | func @{const_name div} T = if_fixed_bvT T "bvudiv" - | func @{const_name mod} T = if_fixed_bvT T "bvurem" - | func @{const_name sdiv} T = if_fixed_bvT T "bvsdiv" - | func @{const_name smod} T = if_fixed_bvT T "bvsmod" - | func @{const_name srem} T = if_fixed_bvT T "bvsrem" - | func @{const_name word_cat} T = if_full_fixed_bvT T "concat" - | func @{const_name bv_shl} T = if_full_fixed_bvT T "bvshl" - | func @{const_name bv_lshr} T = if_full_fixed_bvT T "bvlshr" - | func @{const_name bv_ashr} T = if_full_fixed_bvT T "bvashr" - | func @{const_name slice} T = bv_extract "extract" T - | func @{const_name ucast} T = bv_extend "zero_extend" T - | func @{const_name scast} T = bv_extend "sign_extend" T - | func @{const_name word_rotl} T = bv_rotate "rotate_left" T - | func @{const_name word_rotr} T = bv_rotate "rotate_right" T - | func _ _ = K NONE +fun func @{const_name If} _ = SOME "ite" + | func @{const_name uminus} T = if_int_type T "~" + | func @{const_name plus} T = if_int_type T "+" + | func @{const_name minus} T = if_int_type T "-" + | func @{const_name times} T = if_int_type T "*" + | func _ _ = NONE + +val is_propT = (fn @{typ prop} => true | _ => false) +fun is_connT T = Term.strip_type T |> (fn (Us, U) => forall is_propT (U :: Us)) +fun is_predT T = is_propT (Term.body_type T) fun is_builtin_conn (n, T) = is_connT T andalso is_some (conn n) -fun is_builtin_pred (n, T) = is_predT T andalso is_some (pred n T) +fun is_builtin_pred ctxt (n, T) = is_predT T andalso + (is_some (pred n T) orelse chained_is_builtin_pred (get_builtins ctxt) n T) -fun builtin_fun (n, T) ts = - if is_connT T then conn n |> Option.map (rpair ts) - else if is_predT T then pred n T |> Option.map (rpair ts) - else func n T ts +fun builtin_fun ctxt (c as (n, T)) ts = + let + val builtin_func' = chained_builtin_func (get_builtins ctxt) + val builtin_pred' = chained_builtin_pred (get_builtins ctxt) + in + if is_connT T then conn n |> Option.map (rpair ts) + else if is_predT T then + (case pred n T of SOME c' => SOME (c', ts) | NONE => builtin_pred' c ts) + else + (case func n T of SOME c' => SOME (c', ts) | NONE => builtin_func' c ts) + end (** serialization **) +(* header *) + +structure Logics = Generic_Data +( + type T = (int * (term list -> string option)) list + val empty = [] + val extend = I + fun merge (bs1, bs2) = OrdList.union fst_int_ord bs2 bs1 +) + +fun add_logic l = Logics.map (OrdList.insert fst_int_ord (serial (), l)) + +fun choose_logic ctxt ts = + let + fun choose [] = "AUFLIA" + | choose ((_, l) :: ls) = (case l ts of SOME s => s | NONE => choose ls) + in [":logic " ^ choose (rev (Logics.get (Context.Proof ctxt)))] end + + +(* serialization *) + val add = Buffer.add fun sep f = add " " #> f fun enclose l r f = sep (add l #> f #> add r) @@ -242,16 +248,11 @@ | pats (T.SNoPat ts) = pat ":nopat" ts in par (quant q #> fold var_decl vs #> sub t #> fold pats ps) end -fun choose_logic theories = - if member (op =) theories T.Bitvector then "QF_AUFBV" - else if member (op =) theories T.Real then "AUFLIRA" - else "AUFLIA" - -fun serialize comments {theories, sorts, funcs} ts = +fun serialize comments {header, sorts, funcs} ts = Buffer.empty |> line (add "(benchmark Isabelle") |> line (add ":status unknown") - |> line (add ":logic " #> add (choose_logic theories)) + |> fold (line o add) header |> length sorts > 0 ? line (add ":extrasorts" #> par (fold (sep o add) sorts)) |> length funcs > 0 ? ( @@ -266,7 +267,7 @@ -(** interface **) +(** interfaces **) val interface = { extra_norm = extra_norm, @@ -274,6 +275,7 @@ prefixes = { sort_prefix = "S", func_prefix = "f"}, + header = choose_logic, strict = SOME { is_builtin_conn = is_builtin_conn, is_builtin_pred = is_builtin_pred, diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/yices_solver.ML --- a/src/HOL/Tools/SMT/yices_solver.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/yices_solver.ML Wed May 12 23:54:04 2010 +0200 @@ -31,7 +31,7 @@ else raise SMT_Solver.SMT (solver_name ^ " failed") end -fun smtlib_solver oracle _ = { +fun solver oracle _ = { command = {env_var=env_var, remote_name=NONE}, arguments = options, interface = SMTLIB_Interface.interface, @@ -39,6 +39,6 @@ val setup = Thm.add_oracle (Binding.name solver_name, core_oracle) #-> (fn (_, oracle) => - SMT_Solver.add_solver (solver_name, smtlib_solver oracle)) + Context.theory_map (SMT_Solver.add_solver (solver_name, solver oracle))) end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/z3_interface.ML --- a/src/HOL/Tools/SMT/z3_interface.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/z3_interface.ML Wed May 12 23:54:04 2010 +0200 @@ -6,32 +6,234 @@ signature Z3_INTERFACE = sig - val interface: SMT_Translate.config + type builtin_fun = string * typ -> term list -> (string * term list) option + val add_builtin_funs: builtin_fun -> Context.generic -> Context.generic + val interface: SMT_Solver.interface - val is_builtin: term -> bool + datatype sym = Sym of string * sym list + type mk_builtins = { + mk_builtin_typ: sym -> typ option, + mk_builtin_num: theory -> int -> typ -> cterm option, + mk_builtin_fun: theory -> sym -> cterm list -> cterm option } + val add_mk_builtins: mk_builtins -> Context.generic -> Context.generic + val mk_builtin_typ: Proof.context -> sym -> typ option + val mk_builtin_num: Proof.context -> int -> typ -> cterm option + val mk_builtin_fun: Proof.context -> sym -> cterm list -> cterm option + + val is_builtin_theory_term: Proof.context -> term -> bool + + val mk_inst_pair: (ctyp -> 'a) -> cterm -> 'a * cterm + val destT1: ctyp -> ctyp + val destT2: ctyp -> ctyp + val instT': cterm -> ctyp * cterm -> cterm end structure Z3_Interface: Z3_INTERFACE = struct -fun z3_builtin_fun bf c ts = - (case Const c of - @{term "op / :: real => _"} => SOME ("/", ts) - | _ => bf c ts) + +(** Z3-specific builtins **) + +type builtin_fun = string * typ -> term list -> (string * term list) option + +fun fst_int_ord ((s1, _), (s2, _)) = int_ord (s1, s2) + +structure Builtins = Generic_Data +( + type T = (int * builtin_fun) list + val empty = [] + val extend = I + fun merge (bs1, bs2) = OrdList.union fst_int_ord bs2 bs1 +) + +fun add_builtin_funs b = + Builtins.map (OrdList.insert fst_int_ord (serial (), b)) + +fun get_builtin_funs ctxt c ts = + let + fun chained [] = NONE + | chained (b :: bs) = (case b c ts of SOME x => SOME x | _ => chained bs) + in chained (map snd (Builtins.get (Context.Proof ctxt))) end + +fun z3_builtin_fun builtin_fun ctxt c ts = + (case builtin_fun ctxt c ts of + SOME x => SOME x + | _ => get_builtin_funs ctxt c ts) -val {prefixes, strict, builtins, serialize} = SMTLIB_Interface.interface -val {builtin_typ, builtin_num, builtin_fun} = builtins + +(** interface **) + +local + val {extra_norm, translate} = SMTLIB_Interface.interface + val {prefixes, strict, header, builtins, serialize} = translate + val {is_builtin_pred, ...}= the strict + val {builtin_typ, builtin_num, builtin_fun} = builtins + + val z3_builtin_fun' = z3_builtin_fun builtin_fun + + val as_propT = (fn @{typ bool} => @{typ prop} | T => T) +in + +fun is_builtin_num ctxt (T, i) = is_some (builtin_num ctxt T i) + +fun is_builtin_fun ctxt (c as (n, T)) ts = + is_some (z3_builtin_fun' ctxt c ts) orelse + is_builtin_pred ctxt (n, Term.strip_type T ||> as_propT |> (op --->)) val interface = { - extra_norm = + extra_norm = extra_norm, translate = { prefixes = prefixes, strict = strict, + header = header, builtins = { builtin_typ = builtin_typ, builtin_num = builtin_num, - builtin_fun = z3_builtin_fun builtin_fun}, + builtin_fun = z3_builtin_fun'}, serialize = serialize}} end + + + +(** constructors **) + +datatype sym = Sym of string * sym list + + +(* additional constructors *) + +type mk_builtins = { + mk_builtin_typ: sym -> typ option, + mk_builtin_num: theory -> int -> typ -> cterm option, + mk_builtin_fun: theory -> sym -> cterm list -> cterm option } + +fun chained _ [] = NONE + | chained f (b :: bs) = (case f b of SOME y => SOME y | NONE => chained f bs) + +fun chained_mk_builtin_typ bs sym = + chained (fn {mk_builtin_typ=mk, ...} : mk_builtins => mk sym) bs + +fun chained_mk_builtin_num ctxt bs i T = + let val thy = ProofContext.theory_of ctxt + in chained (fn {mk_builtin_num=mk, ...} : mk_builtins => mk thy i T) bs end + +fun chained_mk_builtin_fun ctxt bs s cts = + let val thy = ProofContext.theory_of ctxt + in chained (fn {mk_builtin_fun=mk, ...} : mk_builtins => mk thy s cts) bs end + +structure Mk_Builtins = Generic_Data +( + type T = (int * mk_builtins) list + val empty = [] + val extend = I + fun merge (bs1, bs2) = OrdList.union fst_int_ord bs2 bs1 +) + +fun add_mk_builtins mk = + Mk_Builtins.map (OrdList.insert fst_int_ord (serial (), mk)) + +fun get_mk_builtins ctxt = map snd (Mk_Builtins.get (Context.Proof ctxt)) + + +(* basic and additional constructors *) + +fun mk_builtin_typ _ (Sym ("bool", _)) = SOME @{typ bool} + | mk_builtin_typ _ (Sym ("int", _)) = SOME @{typ int} + | mk_builtin_typ ctxt sym = chained_mk_builtin_typ (get_mk_builtins ctxt) sym + +fun mk_builtin_num _ i @{typ int} = SOME (Numeral.mk_cnumber @{ctyp int} i) + | mk_builtin_num ctxt i T = + chained_mk_builtin_num ctxt (get_mk_builtins ctxt) i T + +fun instTs cUs (cTs, ct) = Thm.instantiate_cterm (cTs ~~ cUs, []) ct +fun instT cU (cT, ct) = instTs [cU] ([cT], ct) +fun instT' ct = instT (Thm.ctyp_of_term ct) +fun mk_inst_pair destT cpat = (destT (Thm.ctyp_of_term cpat), cpat) +val destT1 = hd o Thm.dest_ctyp +val destT2 = hd o tl o Thm.dest_ctyp + +val mk_true = @{cterm "~False"} +val mk_false = @{cterm False} +val mk_not = Thm.capply @{cterm Not} +val mk_implies = Thm.mk_binop @{cterm "op -->"} +val mk_iff = Thm.mk_binop @{cterm "op = :: bool => _"} + +fun mk_nary _ cu [] = cu + | mk_nary ct _ cts = uncurry (fold_rev (Thm.mk_binop ct)) (split_last cts) + +val eq = mk_inst_pair destT1 @{cpat "op ="} +fun mk_eq ct cu = Thm.mk_binop (instT' ct eq) ct cu + +val if_term = mk_inst_pair (destT1 o destT2) @{cpat If} +fun mk_if cc ct cu = Thm.mk_binop (Thm.capply (instT' ct if_term) cc) ct cu + +val nil_term = mk_inst_pair destT1 @{cpat Nil} +val cons_term = mk_inst_pair destT1 @{cpat Cons} +fun mk_list cT cts = + fold_rev (Thm.mk_binop (instT cT cons_term)) cts (instT cT nil_term) + +val distinct = mk_inst_pair (destT1 o destT1) @{cpat distinct} +fun mk_distinct [] = mk_true + | mk_distinct (cts as (ct :: _)) = + Thm.capply (instT' ct distinct) (mk_list (Thm.ctyp_of_term ct) cts) + +val access = mk_inst_pair (Thm.dest_ctyp o destT1) @{cpat apply} +fun mk_access array index = + let val cTs = Thm.dest_ctyp (Thm.ctyp_of_term array) + in Thm.mk_binop (instTs cTs access) array index end + +val update = mk_inst_pair (Thm.dest_ctyp o destT1) @{cpat fun_upd} +fun mk_update array index value = + let val cTs = Thm.dest_ctyp (Thm.ctyp_of_term array) + in Thm.capply (Thm.mk_binop (instTs cTs update) array index) value end + +val mk_uminus = Thm.capply @{cterm "uminus :: int => _"} +val mk_add = Thm.mk_binop @{cterm "op + :: int => _"} +val mk_sub = Thm.mk_binop @{cterm "op - :: int => _"} +val mk_mul = Thm.mk_binop @{cterm "op * :: int => _"} +val mk_lt = Thm.mk_binop @{cterm "op < :: int => _"} +val mk_le = Thm.mk_binop @{cterm "op <= :: int => _"} + +fun mk_builtin_fun ctxt sym cts = + (case (sym, cts) of + (Sym ("true", _), []) => SOME mk_true + | (Sym ("false", _), []) => SOME mk_false + | (Sym ("not", _), [ct]) => SOME (mk_not ct) + | (Sym ("and", _), _) => SOME (mk_nary @{cterm "op &"} mk_true cts) + | (Sym ("or", _), _) => SOME (mk_nary @{cterm "op |"} mk_false cts) + | (Sym ("implies", _), [ct, cu]) => SOME (mk_implies ct cu) + | (Sym ("iff", _), [ct, cu]) => SOME (mk_iff ct cu) + | (Sym ("~", _), [ct, cu]) => SOME (mk_iff ct cu) + | (Sym ("xor", _), [ct, cu]) => SOME (mk_not (mk_iff ct cu)) + | (Sym ("ite", _), [ct1, ct2, ct3]) => SOME (mk_if ct1 ct2 ct3) + | (Sym ("=", _), [ct, cu]) => SOME (mk_eq ct cu) + | (Sym ("distinct", _), _) => SOME (mk_distinct cts) + | (Sym ("select", _), [ca, ck]) => SOME (mk_access ca ck) + | (Sym ("store", _), [ca, ck, cv]) => SOME (mk_update ca ck cv) + | _ => + (case (sym, try (#T o Thm.rep_cterm o hd) cts, cts) of + (Sym ("+", _), SOME @{typ int}, [ct, cu]) => SOME (mk_add ct cu) + | (Sym ("-", _), SOME @{typ int}, [ct]) => SOME (mk_uminus ct) + | (Sym ("-", _), SOME @{typ int}, [ct, cu]) => SOME (mk_sub ct cu) + | (Sym ("*", _), SOME @{typ int}, [ct, cu]) => SOME (mk_mul ct cu) + | (Sym ("<", _), SOME @{typ int}, [ct, cu]) => SOME (mk_lt ct cu) + | (Sym ("<=", _), SOME @{typ int}, [ct, cu]) => SOME (mk_le ct cu) + | (Sym (">", _), SOME @{typ int}, [ct, cu]) => SOME (mk_lt cu ct) + | (Sym (">=", _), SOME @{typ int}, [ct, cu]) => SOME (mk_le cu ct) + | _ => chained_mk_builtin_fun ctxt (get_mk_builtins ctxt) sym cts)) + + + +(** abstraction **) + +fun is_builtin_theory_term ctxt t = + (case try HOLogic.dest_number t of + SOME n => is_builtin_num ctxt n + | NONE => + (case Term.strip_comb t of + (Const c, ts) => is_builtin_fun ctxt c ts + | _ => false)) + +end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/z3_proof_parser.ML --- a/src/HOL/Tools/SMT/z3_proof_parser.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/z3_proof_parser.ML Wed May 12 23:54:04 2010 +0200 @@ -29,6 +29,10 @@ structure Z3_Proof_Parser: Z3_PROOF_PARSER = struct +structure I = Z3_Interface + + + (** proof rules **) datatype rule = TrueAxiom | Asserted | Goal | ModusPonens | Reflexivity | @@ -87,16 +91,15 @@ (** certified terms and variables **) -val (var_prefix, decl_prefix) = ("v", "sk") (* must be distinct *) +val (var_prefix, decl_prefix) = ("v", "sk") +(* "decl_prefix" is for skolem constants (represented by free variables) + "var_prefix" is for pseudo-schematic variables (schematic with respect + to the Z3 proof, but represented by free variables) -fun instTs cUs (cTs, ct) = Thm.instantiate_cterm (cTs ~~ cUs, []) ct -fun instT cU (cT, ct) = instTs [cU] ([cT], ct) -fun mk_inst_pair destT cpat = (destT (Thm.ctyp_of_term cpat), cpat) -val destT1 = hd o Thm.dest_ctyp -val destT2 = hd o tl o Thm.dest_ctyp - -fun ctyp_of (ct, _) = Thm.ctyp_of_term ct -fun instT' t = instT (ctyp_of t) + Both prefixes must be distinct to avoid name interferences. + More precisely, the naming of pseudo-schematic variables must be + context-independent modulo the current proof context to be able to + use fast inference kernel rules during proof reconstruction. *) fun certify ctxt = Thm.cterm_of (ProofContext.theory_of ctxt) @@ -128,12 +131,11 @@ (case AList.lookup (op =) vars 0 of SOME cv => cv | _ => Thm.cterm_of thy (Var ((Name.uu, maxidx_of ct + 1), T))) - val cq = instT (Thm.ctyp_of_term cv) q fun dec (i, v) = if i = 0 then NONE else SOME (i-1, v) - in (Thm.capply cq (Thm.cabs cv ct), map_filter dec vars) end + in (Thm.capply (I.instT' cv q) (Thm.cabs cv ct), map_filter dec vars) end - val forall = mk_inst_pair (destT1 o destT1) @{cpat All} - val exists = mk_inst_pair (destT1 o destT1) @{cpat Ex} + val forall = I.mk_inst_pair (I.destT1 o I.destT1) @{cpat All} + val exists = I.mk_inst_pair (I.destT1 o I.destT1) @{cpat Ex} in fun mk_forall thy = fold_rev (mk_quant thy forall) fun mk_exists thy = fold_rev (mk_quant thy exists) @@ -143,118 +145,29 @@ local fun equal_var cv (_, cu) = (cv aconvc cu) - fun apply (ct2, vars2) (ct1, vars1) = + fun prep (ct, vars) (maxidx, all_vars) = let - val incr = Thm.incr_indexes_cterm (maxidx_of ct1 + maxidx_of ct2 + 2) + val maxidx' = maxidx_of ct + maxidx + 1 fun part (v as (i, cv)) = - (case AList.lookup (op =) vars1 i of + (case AList.lookup (op =) all_vars i of SOME cu => apfst (if cu aconvc cv then I else cons (cv, cu)) | NONE => - if not (exists (equal_var cv) vars1) then apsnd (cons v) + if not (exists (equal_var cv) all_vars) then apsnd (cons v) else - let val cv' = incr cv + let val cv' = Thm.incr_indexes_cterm maxidx' cv in apfst (cons (cv, cv')) #> apsnd (cons (i, cv')) end) - val (ct2', vars2') = - if null vars1 then (ct2, vars2) - else fold part vars2 ([], []) - |>> (fn inst => Thm.instantiate_cterm ([], inst) ct2) - - in (Thm.capply ct1 ct2', vars1 @ vars2') end -in -fun mk_fun ct ts = fold apply ts (ct, []) -fun mk_binop f t u = mk_fun f [t, u] -fun mk_nary _ e [] = e - | mk_nary ct _ es = uncurry (fold_rev (mk_binop ct)) (split_last es) -end - - -val mk_true = mk_fun @{cterm "~False"} [] -val mk_false = mk_fun @{cterm "False"} [] -fun mk_not t = mk_fun @{cterm Not} [t] -val mk_imp = mk_binop @{cterm "op -->"} -val mk_iff = mk_binop @{cterm "op = :: bool => _"} - -val eq = mk_inst_pair destT1 @{cpat "op ="} -fun mk_eq t u = mk_binop (instT' t eq) t u - -val if_term = mk_inst_pair (destT1 o destT2) @{cpat If} -fun mk_if c t u = mk_fun (instT' t if_term) [c, t, u] - -val nil_term = mk_inst_pair destT1 @{cpat Nil} -val cons_term = mk_inst_pair destT1 @{cpat Cons} -fun mk_list cT es = - fold_rev (mk_binop (instT cT cons_term)) es (mk_fun (instT cT nil_term) []) - -val distinct = mk_inst_pair (destT1 o destT1) @{cpat distinct} -fun mk_distinct [] = mk_true - | mk_distinct (es as (e :: _)) = - mk_fun (instT' e distinct) [mk_list (ctyp_of e) es] - - -(* arithmetic *) - -fun mk_int_num i = mk_fun (Numeral.mk_cnumber @{ctyp int} i) [] -fun mk_real_num i = mk_fun (Numeral.mk_cnumber @{ctyp real} i) [] -fun mk_real_frac_num (e, NONE) = mk_real_num e - | mk_real_frac_num (e, SOME d) = - mk_binop @{cterm "op / :: real => _"} (mk_real_num e) (mk_real_num d) - -fun has_int_type e = (Thm.typ_of (ctyp_of e) = @{typ int}) -fun choose e i r = if has_int_type e then i else r + val (inst, vars') = + if null vars then ([], vars) + else fold part vars ([], []) -val uminus_i = @{cterm "uminus :: int => _"} -val uminus_r = @{cterm "uminus :: real => _"} -fun mk_uminus e = mk_fun (choose e uminus_i uminus_r) [e] - -fun arith_op int_op real_op t u = mk_binop (choose t int_op real_op) t u - -val mk_add = arith_op @{cterm "op + :: int => _"} @{cterm "op + :: real => _"} -val mk_sub = arith_op @{cterm "op - :: int => _"} @{cterm "op - :: real => _"} -val mk_mul = arith_op @{cterm "op * :: int => _"} @{cterm "op * :: real => _"} -val mk_int_div = mk_binop @{cterm "op div :: int => _"} -val mk_real_div = mk_binop @{cterm "op / :: real => _"} -val mk_mod = mk_binop @{cterm "op mod :: int => _"} -val mk_lt = arith_op @{cterm "op < :: int => _"} @{cterm "op < :: real => _"} -val mk_le = arith_op @{cterm "op <= :: int => _"} @{cterm "op <= :: real => _"} - - -(* arrays *) - -val access = mk_inst_pair (Thm.dest_ctyp o destT1) @{cpat apply} -fun mk_access array index = - let val cTs = Thm.dest_ctyp (ctyp_of array) - in mk_fun (instTs cTs access) [array, index] end - -val update = mk_inst_pair (Thm.dest_ctyp o destT1) @{cpat fun_upd} -fun mk_update array index value = - let val cTs = Thm.dest_ctyp (ctyp_of array) - in mk_fun (instTs cTs update) [array, index, value] end - - -(* bitvectors *) - -fun mk_binT size = - let - fun bitT i T = - if i = 0 - then Type (@{type_name "Numeral_Type.bit0"}, [T]) - else Type (@{type_name "Numeral_Type.bit1"}, [T]) - - fun binT i = - if i = 0 then @{typ "Numeral_Type.num0"} - else if i = 1 then @{typ "Numeral_Type.num1"} - else let val (q, r) = Integer.div_mod i 2 in bitT r (binT q) end - in - if size >= 0 then binT size - else raise TYPE ("mk_binT: " ^ string_of_int size, [], []) - end - -fun mk_wordT size = Type (@{type_name "word"}, [mk_binT size]) - -fun mk_bv_num thy (num, size) = - mk_fun (Numeral.mk_cnumber (Thm.ctyp_of thy (mk_wordT size)) num) [] + in (Thm.instantiate_cterm ([], inst) ct, (maxidx', vars' @ all_vars)) end +in +fun mk_fun f ts = + let val (cts, (_, vars)) = fold_map prep ts (~1, []) + in f cts |> Option.map (rpair vars) end +end @@ -277,6 +190,7 @@ fun cert @{term True} = @{cterm "~False"} | cert t = certify ctxt' t + in (typs, Symtab.map cert terms, Inttab.empty, Inttab.empty, [], ctxt') end fun fresh_name n (typs, terms, exprs, steps, vars, ctxt) = @@ -285,14 +199,6 @@ fun theory_of (_, _, _, _, _, ctxt) = ProofContext.theory_of ctxt -fun typ_of_sort n (cx as (typs, _, _, _, _, _)) = - (case Symtab.lookup typs n of - SOME T => (T, cx) - | NONE => cx - |> fresh_name ("'" ^ n) |>> TFree o rpair @{sort type} - |> (fn (T, (typs, terms, exprs, steps, vars, ctxt)) => - (T, (Symtab.update (n, T) typs, terms, exprs, steps, vars, ctxt)))) - fun add_decl (n, T) (cx as (_, terms, _, _, _, _)) = (case Symtab.lookup terms n of SOME _ => cx @@ -301,36 +207,20 @@ let val upd = Symtab.update (n, certify ctxt (Free (m, T))) in (typs, upd terms, exprs, steps, vars, ctxt) end)) -datatype sym = Sym of string * sym list +fun mk_typ (typs, _, _, _, _, ctxt) (s as I.Sym (n, _)) = + (case I.mk_builtin_typ ctxt s of + SOME T => SOME T + | NONE => Symtab.lookup typs n) -fun mk_app _ (Sym ("true", _), _) = SOME mk_true - | mk_app _ (Sym ("false", _), _) = SOME mk_false - | mk_app _ (Sym ("=", _), [t, u]) = SOME (mk_eq t u) - | mk_app _ (Sym ("distinct", _), ts) = SOME (mk_distinct ts) - | mk_app _ (Sym ("ite", _), [s, t, u]) = SOME (mk_if s t u) - | mk_app _ (Sym ("and", _), ts) = SOME (mk_nary @{cterm "op &"} mk_true ts) - | mk_app _ (Sym ("or", _), ts) = SOME (mk_nary @{cterm "op |"} mk_false ts) - | mk_app _ (Sym ("iff", _), [t, u]) = SOME (mk_iff t u) - | mk_app _ (Sym ("xor", _), [t, u]) = SOME (mk_not (mk_iff t u)) - | mk_app _ (Sym ("not", _), [t]) = SOME (mk_not t) - | mk_app _ (Sym ("implies", _), [t, u]) = SOME (mk_imp t u) - | mk_app _ (Sym ("~", _), [t, u]) = SOME (mk_iff t u) - | mk_app _ (Sym ("<", _), [t, u]) = SOME (mk_lt t u) - | mk_app _ (Sym ("<=", _), [t, u]) = SOME (mk_le t u) - | mk_app _ (Sym (">", _), [t, u]) = SOME (mk_lt u t) - | mk_app _ (Sym (">=", _), [t, u]) = SOME (mk_le u t) - | mk_app _ (Sym ("+", _), [t, u]) = SOME (mk_add t u) - | mk_app _ (Sym ("-", _), [t, u]) = SOME (mk_sub t u) - | mk_app _ (Sym ("-", _), [t]) = SOME (mk_uminus t) - | mk_app _ (Sym ("*", _), [t, u]) = SOME (mk_mul t u) - | mk_app _ (Sym ("/", _), [t, u]) = SOME (mk_real_div t u) - | mk_app _ (Sym ("div", _), [t, u]) = SOME (mk_int_div t u) - | mk_app _ (Sym ("mod", _), [t, u]) = SOME (mk_mod t u) - | mk_app _ (Sym ("select", _), [m, k]) = SOME (mk_access m k) - | mk_app _ (Sym ("store", _), [m, k, v]) = SOME (mk_update m k v) - | mk_app _ (Sym ("pattern", _), _) = SOME mk_true - | mk_app (_, terms, _, _, _, _) (Sym (n, _), ts) = - Symtab.lookup terms n |> Option.map (fn ct => mk_fun ct ts) +fun mk_num (_, _, _, _, _, ctxt) (i, T) = + mk_fun (K (I.mk_builtin_num ctxt i T)) [] + +fun mk_app (_, terms, _, _, _, ctxt) (s as I.Sym (n, _), es) = + mk_fun (fn cts => + (case I.mk_builtin_fun ctxt s cts of + SOME ct => SOME ct + | NONE => + Symtab.lookup terms n |> Option.map (Drule.list_comb o rpair cts))) es fun add_expr k t (typs, terms, exprs, steps, vars, ctxt) = (typs, terms, Inttab.update (k, t) exprs, steps, vars, ctxt) @@ -395,8 +285,9 @@ "4" => SOME 4 | "5" => SOME 5 | "6" => SOME 6 | "7" => SOME 7 | "8" => SOME 8 | "9" => SOME 9 | _ => NONE) -fun mk_num ds = fold (fn d => fn i => i * 10 + d) ds 0 -val nat_num = Scan.lift (Scan.repeat1 (Scan.some digit)) >> mk_num +val digits = Scan.lift (Scan.many1 Symbol.is_ascii_digit) >> implode +val nat_num = Scan.lift (Scan.repeat1 (Scan.some digit)) >> (fn ds => + fold (fn d => fn i => i * 10 + d) ds 0) val int_num = Scan.optional ($$ "-" >> K (fn i => ~i)) I :|-- (fn sign => nat_num >> sign) @@ -404,7 +295,8 @@ member (op =) (explode "_+*-/%~=<>$&|?!.@^#") val name = Scan.lift (Scan.many1 is_char) >> implode -fun sym st = (name -- Scan.optional (bra (seps_by ($$ ":") sym)) [] >> Sym) st +fun sym st = + (name -- Scan.optional (bra (seps_by ($$ ":") sym)) [] >> I.Sym) st fun id st = ($$ "#" |-- nat_num) st @@ -412,29 +304,40 @@ (* parsers for various parts of Z3 proofs *) fun sort st = Scan.first [ - this "bool" >> K @{typ bool}, - this "int" >> K @{typ int}, - this "real" >> K @{typ real}, - this "bv" |-- bra nat_num >> mk_wordT, this "array" |-- bra (sort --| $$ ":" -- sort) >> (op -->), par (this "->" |-- seps1 sort) >> ((op --->) o split_last), - name :|-- with_context typ_of_sort] st + sym :|-- (fn s as I.Sym (n, _) => lookup_context mk_typ s :|-- (fn + SOME T => Scan.succeed T + | NONE => scan_exn ("unknown sort: " ^ quote n)))] st fun bound st = (par (this ":var" |-- sep nat_num -- sep sort) :|-- lookup_context (mk_bound o theory_of)) st -fun number st = st |> ( - int_num -- Scan.option ($$ "/" |-- int_num) --| this "::" :|-- - (fn num as (n, _) => - this "int" >> K (mk_int_num n) || - this "real" >> K (mk_real_frac_num num))) +fun numb (n as (i, _)) = lookup_context mk_num n :|-- (fn + SOME n' => Scan.succeed n' + | NONE => scan_exn ("unknown number: " ^ quote (string_of_int i))) + +fun appl (app as (I.Sym (n, _), _)) = lookup_context mk_app app :|-- (fn + SOME app' => Scan.succeed app' + | NONE => scan_exn ("unknown function symbol: " ^ quote n)) + +fun bv_size st = (digits >> (fn sz => I.Sym ("bv", [I.Sym (sz, [])]))) st -fun bv_number st = (this "bv" |-- bra (nat_num --| $$ ":" -- nat_num) :|-- - lookup_context (mk_bv_num o theory_of)) st +fun bv_number_sort st = (bv_size :|-- lookup_context mk_typ :|-- (fn + SOME cT => Scan.succeed cT + | NONE => scan_exn ("unknown sort: " ^ quote "bv"))) st + +fun bv_number st = + (this "bv" |-- bra (nat_num --| $$ ":" -- bv_number_sort) :|-- numb) st -fun appl (app as (Sym (n, _), _)) = lookup_context mk_app app :|-- (fn - SOME app' => Scan.succeed app' - | NONE => scan_exn ("unknown function: " ^ quote n)) +fun frac_number st = ( + int_num --| $$ "/" -- int_num --| this "::" -- sort :|-- (fn ((i, j), T) => + numb (i, T) -- numb (j, T) :|-- (fn (n, m) => + appl (I.Sym ("/", []), [n, m])))) st + +fun plain_number st = (int_num --| this "::" -- sort :|-- numb) st + +fun number st = Scan.first [bv_number, frac_number, plain_number] st fun constant st = ((sym >> rpair []) :|-- appl) st @@ -442,24 +345,27 @@ SOME e => Scan.succeed e | NONE => scan_exn ("unknown term id: " ^ quote (string_of_int i))))) st -fun arg st = Scan.first [expr_id, number, bv_number, constant] st +fun arg st = Scan.first [expr_id, number, constant] st fun application st = par ((sym -- Scan.repeat1 (sep arg)) :|-- appl) st fun variables st = par (this "vars" |-- seps1 (par (name |-- sep sort))) st -fun patterns st = seps (par ((this ":pat" || this ":nopat") |-- seps1 id)) st +fun pats st = seps (par ((this ":pat" || this ":nopat") |-- seps1 id)) st + +fun pattern st = par (this "pattern" |-- Scan.repeat1 (sep arg) >> + (the o mk_fun (K (SOME @{cterm True})))) st fun quant_kind st = st |> ( this "forall" >> K (mk_forall o theory_of) || this "exists" >> K (mk_exists o theory_of)) fun quantifier st = - (par (quant_kind -- sep variables --| patterns -- sep arg) :|-- + (par (quant_kind -- sep variables --| pats -- sep arg) :|-- lookup_context (fn cx => fn ((mk_q, Ts), body) => mk_q cx Ts body)) st fun expr k = - Scan.first [bound, quantifier, application, number, bv_number, constant] :|-- + Scan.first [bound, quantifier, pattern, application, number, constant] :|-- with_context (pair NONE oo add_expr k) fun rule_name st = ((name >> `(Symtab.lookup rule_names)) :|-- (fn diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/z3_proof_reconstruction.ML --- a/src/HOL/Tools/SMT/z3_proof_reconstruction.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/z3_proof_reconstruction.ML Wed May 12 23:54:04 2010 +0200 @@ -6,6 +6,7 @@ signature Z3_PROOF_RECONSTRUCTION = sig + val add_z3_rule: thm -> Context.generic -> Context.generic val trace_assms: bool Config.T val reconstruct: string list * SMT_Translate.recon -> Proof.context -> thm * Proof.context @@ -49,7 +50,7 @@ val del = Thm.declaration_attribute (Z3_Rules.map o del) in -fun get_schematic_rules ctxt = Net.content (Z3_Rules.get (Context.Proof ctxt)) +val add_z3_rule = Z3_Rules.map o ins fun by_schematic_rule ctxt ct = the (T.net_instance (Z3_Rules.get (Context.Proof ctxt)) ct) @@ -94,6 +95,15 @@ in apply o cons (named ctxt "schematic rules" (by_schematic_rule ctxt)) end +local + val rewr_if = + @{lemma "(if P then Q1 else Q2) = ((P --> Q1) & (~P --> Q2))" by simp} +in +val simp_fast_tac = + Simplifier.simp_tac (HOL_ss addsimps [rewr_if]) + THEN_ALL_NEW Classical.fast_tac HOL_cs +end + (** theorems and proofs **) @@ -158,10 +168,9 @@ val assms' = rewrites ctxt (union Thm.eq_thm unfolds' prep_rules) assms in (unfolds', T.thm_net_of assms') end -fun asserted _ NONE ct = Thm (Thm.assume ct) - | asserted ctxt (SOME (unfolds, assms)) ct = - let val revert_conv = rewrite_conv ctxt unfolds - in Thm (T.with_conv revert_conv (lookup_assm ctxt assms) ct) end +fun asserted ctxt (unfolds, assms) ct = + let val revert_conv = rewrite_conv ctxt unfolds + in Thm (T.with_conv revert_conv (lookup_assm ctxt assms) ct) end end @@ -265,7 +274,7 @@ (* distributivity of | over & *) fun distributivity ctxt = Thm o try_apply ctxt [] [ - named ctxt "fast" (T.by_tac (Classical.best_tac HOL_cs))] + named ctxt "fast" (T.by_tac (Classical.fast_tac HOL_cs))] (* FIXME: not very well tested *) @@ -313,16 +322,11 @@ in T.with_conv (dis_conv T.unfold_distinct_conv) prv ct end | _ => raise CTERM ("prove_def_axiom", [ct])) end - - val rewr_if = - @{lemma "(if P then Q1 else Q2) = ((P --> Q1) & (~P --> Q2))" by simp} in fun def_axiom ctxt = Thm o try_apply ctxt [] [ named ctxt "conj/disj/distinct" prove_def_axiom, - T.by_abstraction ctxt [] (fn ctxt' => - named ctxt' "simp+fast" (T.by_tac ( - Simplifier.simp_tac (HOL_ss addsimps [rewr_if]) - THEN_ALL_NEW Classical.best_tac HOL_cs)))] + T.by_abstraction (true, false) ctxt [] (fn ctxt' => + named ctxt' "simp+fast" (T.by_tac simp_fast_tac))] end @@ -381,7 +385,9 @@ |> T.by_tac (nnf_quant_tac (T.varify vars (meta_eq_of p)) qs) fun prove_nnf ctxt = try_apply ctxt [] [ - named ctxt "conj/disj" L.prove_conj_disj_eq] + named ctxt "conj/disj" L.prove_conj_disj_eq, + T.by_abstraction (true, false) ctxt [] (fn ctxt' => + named ctxt' "simp+fast" (T.by_tac simp_fast_tac))] in fun nnf ctxt vars ps ct = (case T.term_of ct of @@ -639,7 +645,7 @@ (* theory lemmas: linear arithmetic, arrays *) fun th_lemma ctxt simpset thms = Thm o try_apply ctxt thms [ - T.by_abstraction ctxt thms (fn ctxt' => T.by_tac ( + T.by_abstraction (false, true) ctxt thms (fn ctxt' => T.by_tac ( NAMED ctxt' "arith" (Arith_Data.arith_tac ctxt') ORELSE' NAMED ctxt' "simp+arith" (Simplifier.simp_tac simpset THEN_ALL_NEW Arith_Data.arith_tac ctxt')))] @@ -683,7 +689,7 @@ fun rewrite ctxt simpset ths = Thm o with_conv ctxt ths (try_apply ctxt [] [ named ctxt "conj/disj/distinct" prove_conj_disj_eq, - T.by_abstraction ctxt [] (fn ctxt' => T.by_tac ( + T.by_abstraction (true, true) ctxt [] (fn ctxt' => T.by_tac ( NAMED ctxt' "simp" (Simplifier.simp_tac simpset) THEN_ALL_NEW ( NAMED ctxt' "fast" (Classical.fast_tac HOL_cs) @@ -722,7 +728,7 @@ fun trace_rule idx prove r ps ct (cxp as (ctxt, ptab)) = let val _ = SMT_Solver.trace_msg ctxt (header idx r o count_rules) ptab - val result as (p, cxp' as (ctxt', _)) = prove r ps ct cxp + val result as (p, (ctxt', _)) = prove r ps ct cxp val _ = if not (Config.get ctxt' SMT_Solver.trace) then () else check ctxt' idx r ps ct p in result end @@ -736,7 +742,7 @@ fun prove ctxt unfolds assms vars = let - val assms' = Option.map (prepare_assms ctxt unfolds) assms + val assms' = prepare_assms ctxt unfolds assms val simpset = T.make_simpset ctxt (Z3_Simps.get ctxt) fun step r ps ct (cxp as (cx, ptab)) = @@ -798,7 +804,7 @@ trace_rule idx step rule ps prop cxp |-> (fn p => apsnd (Inttab.update (idx, Proved p)) #> pair p) - fun lookup idx (cxp as (cx, ptab)) = + fun lookup idx (cxp as (_, ptab)) = (case Inttab.lookup ptab idx of SOME (Unproved (P.Proof_Step {rule, prems, prop})) => fold_map lookup prems cxp diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/z3_proof_tools.ML --- a/src/HOL/Tools/SMT/z3_proof_tools.ML Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Tools/SMT/z3_proof_tools.ML Wed May 12 23:54:04 2010 +0200 @@ -25,8 +25,8 @@ val match_instantiate: (cterm -> cterm) -> cterm -> thm -> thm val by_tac: (int -> tactic) -> cterm -> thm val make_hyp_def: thm -> Proof.context -> thm * Proof.context - val by_abstraction: Proof.context -> thm list -> (Proof.context -> cterm -> - thm) -> cterm -> thm + val by_abstraction: bool * bool -> Proof.context -> thm list -> + (Proof.context -> cterm -> thm) -> cterm -> thm (* a faster COMP *) type compose_data @@ -38,12 +38,15 @@ val unfold_distinct_conv: conv (* simpset *) + val add_simproc: Simplifier.simproc -> Context.generic -> Context.generic val make_simpset: Proof.context -> thm list -> simpset end structure Z3_Proof_Tools: Z3_PROOF_TOOLS = struct +structure I = Z3_Interface + (* accessing terms *) @@ -55,10 +58,8 @@ val mk_prop = Thm.capply @{cterm Trueprop} -val (eqT, eq) = `(hd o Thm.dest_ctyp o Thm.ctyp_of_term) @{cpat "op =="} -fun mk_meta_eq_cterm ct cu = - let val inst = ([(eqT, Thm.ctyp_of_term ct)], []) - in Thm.mk_binop (Thm.instantiate_cterm inst eq) ct cu end +val eq = I.mk_inst_pair I.destT1 @{cpat "op =="} +fun mk_meta_eq_cterm ct cu = Thm.mk_binop (I.instT' ct eq) ct cu fun as_meta_eq ct = uncurry mk_meta_eq_cterm (Thm.dest_binop (Thm.dest_arg ct)) @@ -129,55 +130,45 @@ fun context_of (ctxt, _, _, _) = ctxt -fun replace (cv, ct) = Thm.forall_elim ct o Thm.forall_intr cv +fun replace (_, (cv, ct)) = Thm.forall_elim ct o Thm.forall_intr cv fun abs_instantiate (_, tab, _, beta_norm) = - fold replace (map snd (Termtab.dest tab)) #> + fold replace (Termtab.dest tab) #> beta_norm ? Conv.fconv_rule (Thm.beta_conversion true) -fun generalize cvs = +fun lambda_abstract cvs t = let - val no_name = "" - - fun dest (Free (n, _)) = n - | dest _ = no_name - - fun gen vs (t as Free (n, _)) = - let val i = find_index (equal n) vs - in - if i >= 0 then insert (op aconvc) (nth cvs i) #> pair (Bound i) - else pair t - end - | gen vs (t $ u) = gen vs t ##>> gen vs u #>> (op $) - | gen vs (Abs (n, T, t)) = - gen (no_name :: vs) t #>> (fn u => Abs (n, T, u)) - | gen _ t = pair t - - in (fn ct => gen (map (dest o Thm.term_of) cvs) (Thm.term_of ct) []) end + val frees = map Free (Term.add_frees t []) + val cvs' = filter (fn cv => member (op aconv) frees (Thm.term_of cv)) cvs + val vs = map (Term.dest_Free o Thm.term_of) cvs' + in (Term.list_abs_free (vs, t), cvs') end fun fresh_abstraction cvs ct (cx as (ctxt, tab, idx, beta_norm)) = - let val (t, cvs') = generalize cvs ct + let val (t, cvs') = lambda_abstract cvs (Thm.term_of ct) in (case Termtab.lookup tab t of - SOME (cv, _) => (cv, cx) + SOME (cv, _) => (Drule.list_comb (cv, cvs'), cx) | NONE => let val (n, ctxt') = yield_singleton Variable.variant_fixes "x" ctxt - val cv = certify ctxt (Free (n, map typ_of cvs' ---> typ_of ct)) - val cv' = Drule.list_comb (cv, cvs') + val cv = certify ctxt' (Free (n, map typ_of cvs' ---> typ_of ct)) + val cu = Drule.list_comb (cv, cvs') val e = (t, (cv, fold_rev Thm.cabs cvs' ct)) val beta_norm' = beta_norm orelse not (null cvs') - in (cv', (ctxt', Termtab.update e tab, idx + 1, beta_norm')) end) + in (cu, (ctxt', Termtab.update e tab, idx + 1, beta_norm')) end) end -fun abs_arg f cvs ct = - let val (cf, cu) = Thm.dest_comb ct - in f cvs cu #>> Thm.capply cf end - fun abs_comb f g cvs ct = let val (cf, cu) = Thm.dest_comb ct in f cvs cf ##>> g cvs cu #>> uncurry Thm.capply end +fun abs_arg f = abs_comb (K pair) f + +fun abs_args f cvs ct = + (case Thm.term_of ct of + _ $ _ => abs_comb (abs_args f) f cvs ct + | _ => pair ct) + fun abs_list f g cvs ct = (case Thm.term_of ct of Const (@{const_name Nil}, _) => pair ct @@ -190,11 +181,6 @@ in f (cv :: cvs) cu #>> Thm.cabs cv end val is_atomic = (fn _ $ _ => false | Abs _ => false | _ => true) -val is_arithT = (fn @{typ int} => true | @{typ real} => true | _ => false) -fun is_number t = - (case try HOLogic.dest_number t of - SOME (T, _) => is_arithT T - | NONE => false) fun abstract (ext_logic, with_theories) = let @@ -223,26 +209,12 @@ if ext_logic then abstr_abs cvs ct else fresh_abstraction cvs ct | Const (@{const_name Ex}, _) $ _ => if ext_logic then abstr_abs cvs ct else fresh_abstraction cvs ct - | @{term "uminus :: int => _"} $ _ => abstr1 cvs ct - | @{term "uminus :: real => _"} $ _ => abstr1 cvs ct - | @{term "op + :: int => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op + :: real => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op - :: int => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op - :: real => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op * :: int => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op * :: real => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op div :: int => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op mod :: int => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op / :: real => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op < :: int => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op < :: real => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op <= :: int => _"} $ _ $ _ => abstr2 cvs ct - | @{term "op <= :: real => _"} $ _ $ _ => abstr2 cvs ct - | Const (@{const_name apply}, _) $ _ $ _ => abstr2 cvs ct - | Const (@{const_name fun_upd}, _) $ _ $ _ $ _ => abstr3 cvs ct - | t => - if is_atomic t orelse is_number t then pair ct - else fresh_abstraction cvs ct) + | t => (fn cx => + if is_atomic t orelse can HOLogic.dest_number t then (ct, cx) + else if with_theories andalso + I.is_builtin_theory_term (context_of cx) t + then abs_args abstr cvs ct cx + else fresh_abstraction cvs ct cx)) in abstr [] end fun with_prems thms f ct = @@ -252,8 +224,8 @@ in -fun by_abstraction ctxt thms prove = with_prems thms (fn ct => - let val (cu, cx) = abstract (true, true) ct (abs_context ctxt) +fun by_abstraction mode ctxt thms prove = with_prems thms (fn ct => + let val (cu, cx) = abstract mode ct (abs_context ctxt) in abs_instantiate cx (prove (context_of cx) cu) end) end @@ -340,28 +312,36 @@ | SOME thm => SOME (thm RS antisym_le2)) end handle THM _ => NONE + + val basic_simpset = HOL_ss addsimps @{thms field_simps} + addsimps [@{thm times_divide_eq_right}, @{thm times_divide_eq_left}] + addsimps @{thms arith_special} addsimps @{thms less_bin_simps} + addsimps @{thms le_bin_simps} addsimps @{thms eq_bin_simps} + addsimps @{thms add_bin_simps} addsimps @{thms succ_bin_simps} + addsimps @{thms minus_bin_simps} addsimps @{thms pred_bin_simps} + addsimps @{thms mult_bin_simps} addsimps @{thms iszero_simps} + addsimps @{thms array_rules} + addsimprocs [ + Simplifier.simproc @{theory} "fast_int_arith" [ + "(m::int) < n", "(m::int) <= n", "(m::int) = n"] (K Lin_Arith.simproc), + Simplifier.simproc @{theory} "antisym_le" ["(x::'a::order) <= y"] + (K prove_antisym_le), + Simplifier.simproc @{theory} "antisym_less" ["~ (x::'a::linorder) < y"] + (K prove_antisym_less)] + + structure Simpset = Generic_Data + ( + type T = simpset + val empty = basic_simpset + val extend = I + val merge = Simplifier.merge_ss + ) in -fun make_simpset ctxt rules = Simplifier.context ctxt (HOL_ss - addsimps @{thms field_simps} - addsimps [@{thm times_divide_eq_right}, @{thm times_divide_eq_left}] - addsimps @{thms arith_special} addsimps @{thms less_bin_simps} - addsimps @{thms le_bin_simps} addsimps @{thms eq_bin_simps} - addsimps @{thms add_bin_simps} addsimps @{thms succ_bin_simps} - addsimps @{thms minus_bin_simps} addsimps @{thms pred_bin_simps} - addsimps @{thms mult_bin_simps} addsimps @{thms iszero_simps} - addsimps @{thms array_rules} - addsimprocs [ - Simplifier.simproc @{theory} "fast_int_arith" [ - "(m::int) < n", "(m::int) <= n", "(m::int) = n"] (K Lin_Arith.simproc), - Simplifier.simproc @{theory} "fast_real_arith" [ - "(m::real) < n", "(m::real) <= n", "(m::real) = n"] - (K Lin_Arith.simproc), - Simplifier.simproc @{theory} "antisym_le" ["(x::'a::order) <= y"] - (K prove_antisym_le), - Simplifier.simproc @{theory} "antisym_less" ["~ (x::'a::linorder) < y"] - (K prove_antisym_less)] - addsimps rules) +fun add_simproc simproc = Simpset.map (fn ss => ss addsimprocs [simproc]) + +fun make_simpset ctxt rules = + Simplifier.context ctxt (Simpset.get (Context.Proof ctxt)) addsimps rules end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Tools/SMT/z3_solver.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Tools/SMT/z3_solver.ML Wed May 12 23:54:04 2010 +0200 @@ -0,0 +1,80 @@ +(* Title: HOL/Tools/SMT/z3_solver.ML + Author: Sascha Boehme, TU Muenchen + +Interface of the SMT solver Z3. +*) + +signature Z3_SOLVER = +sig + val proofs: bool Config.T + val options: string Config.T + val setup: theory -> theory +end + +structure Z3_Solver: Z3_SOLVER = +struct + +val solver_name = "z3" +val env_var = "Z3_SOLVER" + +val (proofs, proofs_setup) = Attrib.config_bool "z3_proofs" (K false) +val (options, options_setup) = Attrib.config_string "z3_options" (K "") + +fun add xs ys = ys @ xs + +fun explode_options s = String.tokens (Symbol.is_ascii_blank o str) s + +fun get_options ctxt = + ["MODEL=true", "PRE_SIMPLIFY_EXPR=false", "CONTEXT_SIMPLIFIER=false"] + |> Config.get ctxt proofs ? add ["DISPLAY_PROOF=true", "PROOF_MODE=2"] + |> add (explode_options (Config.get ctxt options)) + +fun pretty_config context = [ + Pretty.str ("With proofs: " ^ + (if Config.get_generic context proofs then "true" else "false")), + Pretty.str ("Options: " ^ + space_implode " " (get_options (Context.proof_of context))) ] + +fun cmdline_options ctxt = + get_options ctxt + |> add ["-smt"] + +fun raise_cex real recon ls = + let val cex = Z3_Model.parse_counterex recon ls + in raise SMT_Solver.SMT_COUNTEREXAMPLE (real, cex) end + +fun if_unsat f (output, recon) = + let + fun jnk l = + String.isPrefix "WARNING" l orelse + String.isPrefix "ERROR" l orelse + forall Symbol.is_ascii_blank (Symbol.explode l) + val (ls, l) = the_default ([], "") (try split_last (filter_out jnk output)) + in + if String.isPrefix "unsat" l then f (ls, recon) + else if String.isPrefix "sat" l then raise_cex true recon ls + else if String.isPrefix "unknown" l then raise_cex false recon ls + else raise SMT_Solver.SMT (solver_name ^ " failed") + end + +val core_oracle = if_unsat (K @{cprop False}) + +val prover = if_unsat Z3_Proof_Reconstruction.reconstruct + +fun solver oracle ctxt = + let val with_proof = Config.get ctxt proofs + in + {command = {env_var=env_var, remote_name=SOME solver_name}, + arguments = cmdline_options ctxt, + interface = Z3_Interface.interface, + reconstruct = if with_proof then prover else pair o oracle} + end + +val setup = + proofs_setup #> + options_setup #> + Thm.add_oracle (Binding.name solver_name, core_oracle) #-> (fn (_, oracle) => + Context.theory_map (SMT_Solver.add_solver (solver_name, solver oracle))) #> + Context.theory_map (SMT_Solver.add_solver_info (solver_name, pretty_config)) + +end diff -r 8e55aa1306c5 -r bcd6fce5bf06 src/HOL/Word/Word.thy --- a/src/HOL/Word/Word.thy Wed May 12 23:54:02 2010 +0200 +++ b/src/HOL/Word/Word.thy Wed May 12 23:54:04 2010 +0200 @@ -6,8 +6,11 @@ theory Word imports WordGenLib +uses "~~/src/HOL/Tools/SMT/smt_word.ML" begin +setup {* SMT_Word.setup *} + text {* see @{text "Examples/WordExamples.thy"} for examples *} end