diff --git a/404.html b/404.html index b37fb6a0f..58d19bbd5 100644 --- a/404.html +++ b/404.html @@ -12,13 +12,13 @@ Page Not Found | Online Z3 Guide - - + +
-
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/Acknowledgments/index.html b/Acknowledgments/index.html index b1be52a45..5b8f61db2 100644 --- a/Acknowledgments/index.html +++ b/Acknowledgments/index.html @@ -12,13 +12,13 @@ Acknowledgements | Online Z3 Guide - - + +
-
Skip to main content

Acknowledgments

The z3guide was created by

  • Ruanqianqian (Lisa) Huang, UCSD, MSR Intern
  • Ayana Monroe, UNC, MSR Intern
  • Nikolaj Bjørner, Peli de Halleux, Microsoft Research

It relies on extensive help and use of the JavaScript bindings created by

  • Kevin Bakkot, Olaf Tomalka

with earlier wasm bindings by Leonardo Alt, Phillip Zucker, and Clément Pit-Claudel.

Material is based on an earlier rise4fun tutorial by Leonardo de Moura and Christoph Wintersteiger.

- - +
Skip to main content

Acknowledgments

The z3guide was created by

  • Ruanqianqian (Lisa) Huang, UCSD, MSR Intern
  • Ayana Monroe, UNC, MSR Intern
  • Nikolaj Bjørner, Peli de Halleux, Microsoft Research

It relies on extensive help and use of the JavaScript bindings created by

  • Kevin Bakkot, Olaf Tomalka

with earlier wasm bindings by Leonardo Alt, Phillip Zucker, and Clément Pit-Claudel.

Material is based on an earlier rise4fun tutorial by Leonardo de Moura and Christoph Wintersteiger.

+ + \ No newline at end of file diff --git a/assets/js/073a52b7.1d0e42ca.js b/assets/js/073a52b7.1d0e42ca.js new file mode 100644 index 000000000..a8ecb7258 --- /dev/null +++ b/assets/js/073a52b7.1d0e42ca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9612],{4218:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=t(7462),s=(t(7294),t(3905)),r=t(7634),m=t.n(r);const i={title:"Arithmetic",sidebar_position:1},l=void 0,o={unversionedId:"theories/Arithmetic",id:"theories/Arithmetic",title:"Arithmetic",description:"Z3 supports the theory of arithmetic described in the following places.",source:"@site/docs-smtlib/02 - theories/01 - Arithmetic.md",sourceDirName:"02 - theories",slug:"/theories/Arithmetic",permalink:"/z3guide/docs/theories/Arithmetic",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/01 - Arithmetic.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Arithmetic",sidebar_position:1},sidebar:"smtlibSidebar",previous:{title:"Conclusion",permalink:"/z3guide/docs/logic/Conclusion"},next:{title:"Bitvectors",permalink:"/z3guide/docs/theories/Bitvectors"}},p={},c=[{value:"Basics",id:"basics",level:2},{value:"Difference Arithmetic",id:"difference-arithmetic",level:2},{value:"Non-linear arithmetic",id:"non-linear-arithmetic",level:2},{value:"Division",id:"division",level:2},{value:"Algorithmic Fragments of Arithmetic",id:"algorithmic-fragments-of-arithmetic",level:2}],d={toc:c};function h(e){let{components:a,...t}=e;return(0,s.kt)("wrapper",(0,n.Z)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Z3 supports the theory of arithmetic described in the following places."),(0,s.kt)("blockquote",{parentName:"admonition"},(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-Ints.shtml"},(0,s.kt)("strong",{parentName:"a"},"SMTLIB2")," standard Integers"))),(0,s.kt)("blockquote",{parentName:"admonition"},(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-Reals.shtml"},(0,s.kt)("strong",{parentName:"a"},"SMTLIB2")," standard Reals"))),(0,s.kt)("blockquote",{parentName:"admonition"},(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-Reals_Ints.shtml"},(0,s.kt)("strong",{parentName:"a"},"SMTLIB2")," standard Mixed Int Reals")))),(0,s.kt)("h2",{id:"basics"},"Basics"),(0,s.kt)("p",null,"Z3 has built-in support for integer and real constants. These two types should not be confused with machine integers (32-bit or 64-bit) and floating point numbers. These two types (sorts) represent the mathematical integers and reals. The command ",(0,s.kt)("inlineCode",{parentName:"p"},"declare-const")," is used to declare integer and real constants."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(declare-const d Real)\n(declare-const e Real)",result:{output:"",error:"",status:"z3-ran",hash:"84b5e01e5572d60505f61498e8aaddb094c3cb47"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"After constants are declared, the user can assert formulas containing that use these constants and arithmetic operators such as +, -, *, etc. The ",(0,s.kt)("inlineCode",{parentName:"p"},"check-sat")," command instructs Z3 to try to find an interpretation for the declared constants that makes all formulas true. The interpretation is basically assigning a number to each constant. If such interpretation exists, we say it is a model for the asserted formulas. The command ",(0,s.kt)("inlineCode",{parentName:"p"},"get-model")," displays the model built by Z3."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(declare-const d Real)\n(declare-const e Real)\n(assert (< a (+ b 2)))\n(assert (= a (+ (* 2 c) 10)))\n(assert (= (+ c b) 1000))\n(assert (= d e))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun b () Int\n 670)\n (define-fun a () Int\n 670)\n (define-fun c () Int\n 330)\n (define-fun e () Real\n 0.0)\n (define-fun d () Real\n 0.0)\n)\n",error:"",status:"z3-ran",hash:"d8aff7daba3c4900cac142c61a83fb1950c10b34"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Real constants should contain a decimal point. Unlike most programming languages, Z3 will not convert automatically integers into reals and vice-versa. The function to-real can be used to convert an integer expression into a real one."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(declare-const d Real)\n(declare-const e Real)\n(assert (< e (+ (to_real (+ a b)) 2.0)))\n(assert (= d (+ (to_real c) 0.5)))\n(assert (< a b))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun e () Real\n 2.0)\n (define-fun b () Int\n 1)\n (define-fun a () Int\n 0)\n (define-fun c () Int\n 0)\n (define-fun d () Real\n (/ 1.0 2.0))\n)\n",error:"",status:"z3-ran",hash:"aa7a9e1f2a4470d684908118f342a9084110afb2"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Some operators are chainable. This includes comparison operators such as ",(0,s.kt)("inlineCode",{parentName:"p"},"<")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"<="),". "),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(assert (< a b c))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun c () Int\n 1)\n (define-fun a () Int\n (- 1))\n (define-fun b () Int\n 0)\n)\n",error:"",status:"z3-ran",hash:"ee18ba5381337b4da6be96d31b91d5c824c89521"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"We can use mixed constraints to ask questions on how reals behave under rounding.\nThe following query considers when the sum of two integers, x, y are above a constant ",(0,s.kt)("inlineCode",{parentName:"p"},"a"),",\nwhile the sum of two reals are below ",(0,s.kt)("inlineCode",{parentName:"p"},"a"),". At the same time the integers x, y are within unit distance\nto the integers. "),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const xR Real)\n(declare-const yR Real)\n(declare-const x Int)\n(declare-const y Int)\n(declare-const a Int)\n\n(assert (< (+ xR yR) a))\n(assert (> (+ x y) a))\n(assert (or (= x xR) (< x xR (+ x 1)) (< (- x 1) xR x)))\n(assert (or (= y yR) (< y yR (+ y 1)) (< (- y 1) yR y)))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun a () Int\n 0)\n (define-fun x () Int\n 1)\n (define-fun xR () Real\n (/ 2.0 3.0))\n (define-fun yR () Real\n (- (/ 5.0 6.0)))\n (define-fun y () Int\n 0)\n)\n",error:"",status:"z3-ran",hash:"2042371221822ffee039176bffa419b6fdac82f9"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"difference-arithmetic"},"Difference Arithmetic"),(0,s.kt)("p",null,"Many problem classes use only limited set of arithmetical constraints. One such class is job-shop scheduling constraints.\nSimpler instances can be encoded and solved using SMT, while advanced uses of job shop scheduling problems do not\nhave efficient encodings directly into arithmetic. For job-shop problems tasks have start time, duration and constraints\nspecifying whether tasks should not overlap and ordering. To specify ordering and overlap constraints require\ncomparing just two time points separated by a constant offset. Comparisons of this form fall within the class\nof ",(0,s.kt)("em",{parentName:"p"},"difference arithmetic")," constraints. "),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(set-logic QF_IDL) ; optional in Z3\n(declare-fun t11 () Int)\n(declare-fun t12 () Int)\n(declare-fun t21 () Int)\n(declare-fun t22 () Int)\n(declare-fun t31 () Int)\n(declare-fun t32 () Int)\n\n(assert (and (>= t11 0) (>= t12 (+ t11 2)) (<= (+ t12 1) 8)))\n(assert (and (>= t21 0) (>= t22 (+ t21 3)) (<= (+ t22 1) 8)))\n(assert (and (>= t31 0) (>= t32 (+ t31 2)) (<= (+ t32 3) 8)))\n(assert (or (>= t11 (+ t21 3)) (>= t21 (+ t11 2))))\n(assert (or (>= t11 (+ t31 2)) (>= t31 (+ t11 2))))\n(assert (or (>= t21 (+ t31 2)) (>= t31 (+ t21 3))))\n(assert (or (>= t12 (+ t22 1)) (>= t22 (+ t12 1))))\n(assert (or (>= t12 (+ t32 3)) (>= t32 (+ t12 1))))\n(assert (or (>= t22 (+ t32 3)) (>= t32 (+ t22 1))))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun t22 () Int\n 5)\n (define-fun t12 () Int\n 7)\n (define-fun t11 () Int\n 5)\n (define-fun t31 () Int\n 0)\n (define-fun t21 () Int\n 2)\n (define-fun t32 () Int\n 2)\n)\n",error:"",status:"z3-ran",hash:"87d782a1124874298a3956fa5c37f2dcd607b7a5"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"In the example we model three jobs, each job has two tasks\nto be completed by two workers. Thus, there are six variables for every task/worker combination.\nThe start time of job 1 on worker 2 is given by ",(0,s.kt)("inlineCode",{parentName:"p"},"t12"),". It has duration 1, so has to start at least one unit before\nthe completion deadline 8. It follows task ",(0,s.kt)("inlineCode",{parentName:"p"},"t11")," which has duration 2 and cannot overlap with other tasks on work station 2."),(0,s.kt)("h2",{id:"non-linear-arithmetic"},"Non-linear arithmetic"),(0,s.kt)("p",null,"We say a formula is nonlinear if it contains expressions of the form (* t s) where t and s are not numbers. Nonlinear real arithmetic is very expensive, and Z3 is not complete for this kind of formula. The command check-sat may return unknown or loop. Nonlinear integer arithmetic is undecidable there is no procedure that is correct and terminates (for every input) with a sat or unsat answer. Yes, it is impossible to build such procedure. Note that, this does not prevent Z3 from returning an answer for many nonlinear problems. The real limit is that there will always be a nonlinear integer arithmetic formula that it will fail produce an answer."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a Int)\n(assert (< (* a a) 3))\n(check-sat)\n(get-model)\n\n(echo "Z3 does not always find solutions to non-linear problems")\n(declare-const b Real)\n(declare-const c Real)\n(assert (= (+ (* b b b) (sin (* b c))) 7))\n(check-sat)\n\n(echo "yet it can show unsatisfiability for some nontrivial nonlinear problems...")\n(declare-const x Real)\n(declare-const y Real)\n(declare-const z Real)\n(assert (= (* x x) (+ x 2.0)))\n(assert (= (* x y) x))\n(assert (= (* (- y 1.0) z) 1.0))\n(check-sat)\n\n(reset)\n(echo "When presented only non-linear polynomial constraints over reals, Z3 uses a specialized complete solver")\n(declare-const b Real)\n(declare-const c Real)\n(assert (= (+ (* b b b) (* b c)) 3.0))\n(check-sat)\n(get-model)',result:{output:"sat\n(\n (define-fun a () Int\n 0)\n)\nZ3 does not always find solutions to non-linear problems\nunknown\nyet it can show unsatisfiability for some nontrivial nonlinear problems...\nunsat\nWhen presented only non-linear polynomial constraints over reals, Z3 uses a specialized complete solver\nsat\n(\n (define-fun b () Real\n (/ 1.0 8.0))\n (define-fun c () Real\n (/ 1535.0 64.0))\n)\n",error:"",status:"z3-ran",hash:"eef0f44fae446a64135b49b3b8056fc9da9dbf48"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"division"},"Division"),(0,s.kt)("p",null,"Z3 also has support for division, integer division, modulo and remainder operators. Internally, they are all mapped to multiplication."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const r1 Int)\n(declare-const r2 Int)\n(declare-const r3 Int)\n(declare-const r4 Int)\n(declare-const r5 Int)\n(declare-const r6 Int)\n(assert (= a 10))\n(assert (= r1 (div a 4))) ; integer division\n(assert (= r2 (mod a 4))) ; mod\n(assert (= r3 (rem a 4))) ; remainder\n(assert (= r4 (div a (- 4)))) ; integer division\n(assert (= r5 (mod a (- 4)))) ; mod\n(assert (= r6 (rem a (- 4)))) ; remainder\n(declare-const b Real)\n(declare-const c Real)\n(assert (= b (/ c 3.0)))\n(assert (= c 20.0))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun r4 () Int\n (- 2))\n (define-fun r5 () Int\n 2)\n (define-fun r6 () Int\n (- 2))\n (define-fun r3 () Int\n 2)\n (define-fun b () Real\n (/ 20.0 3.0))\n (define-fun r2 () Int\n 2)\n (define-fun r1 () Int\n 2)\n (define-fun c () Real\n 20.0)\n (define-fun a () Int\n 10)\n)\n",error:"",status:"z3-ran",hash:"532b4209c39f259fada8ea4f438afdc1efcd2557"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"In Z3, division by zero is allowed, but the result is not specified. Division is not a partial function.\nActually, in Z3 all functions are total, although the result may be under-specified in some cases like division by zero."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"We say that an interpreted function (such as ",(0,s.kt)("inlineCode",{parentName:"p"},"/"),") is ",(0,s.kt)("em",{parentName:"p"},"under-specified")," when the meaning of the function is not fixed on all values\nof arguments. The division, modulus and remainder functions are ",(0,s.kt)("em",{parentName:"p"},"under-specified")," when the second argument is 0. Constraints that\nallow the second arguments to these functions to be 0 can still be satisfiable when there are interpretations of the functions\nat 0 that satisfy the constraints.")),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Real)\n; The following formula is satisfiable since division by zero is not specified.\n(assert (= (/ a 0.0) 10.0)) \n(check-sat)\n(get-model)\n\n; Although division by zero is not specified, division is still a function.\n; Therefore, (/ a 0.0) cannot evaluate to both 10.0 and 2.0.\n(assert (= (/ a 0.0) 2.0)) \n(check-sat)",result:{output:"sat\n(\n (define-fun a () Real\n 38.0)\n (define-fun /0 ((x!0 Real) (x!1 Real)) Real\n 10.0)\n)\nunsat\n",error:"",status:"z3-ran",hash:"3298c16f127d570132fd7fba8482a7525e428bdd"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"If you are not happy with this behavior, you may use the ",(0,s.kt)("inlineCode",{parentName:"p"},"ite")," (if-then-else) operator to guard every division, and assign whatever interpretation you like to the division by zero. This example uses define-fun constructor to create a new operator mydiv. This is essentially a macro, and Z3 will expand its definition for every application of mydiv."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"; defining my own division operator where x0.0 == 0.0 for every x.\n(define-fun mydiv ((x Real) (y Real)) Real\n (if (not (= y 0.0))\n (/ x y)\n 0.0))\n(declare-const a Real)\n(declare-const b Real)\n(assert (= (mydiv a b) 1.0))\n(assert (= b 0.0))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"888b584c6554dcc3ae0f65d16e7e4449c228df98"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"algorithmic-fragments-of-arithmetic"},"Algorithmic Fragments of Arithmetic"),(0,s.kt)("p",null,"Z3 contains a combination of several engines for solving arithmetic formulas.\nThe engines are invoked based on the shape of arithmetic formulas.\nFor linear real arithmetic formulas it uses dual simplex to determine feasibility.\nFor linear integer arithmetic formulas it uses techniques from integer programming: cuts and branch and bound.\nThere are specialized solvers for different arithmetic fragments and, finally, for non-linear arithmetic\nconstraints z3 contains several small hammers that integrate Grobner basis simplifications, bounds propagation,\nnon-linear cylindric algebraic decomposition and reducing non-linear constraints to linear form by sampling at tangent points."),(0,s.kt)("table",null,(0,s.kt)("thead",{parentName:"table"},(0,s.kt)("tr",{parentName:"thead"},(0,s.kt)("th",{parentName:"tr",align:null},"Logic"),(0,s.kt)("th",{parentName:"tr",align:null},"Fragment"),(0,s.kt)("th",{parentName:"tr",align:null},"Solver"),(0,s.kt)("th",{parentName:"tr",align:null},"Example"))),(0,s.kt)("tbody",{parentName:"table"},(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"LRA"),(0,s.kt)("td",{parentName:"tr",align:null},"Linear Real Arithmetic"),(0,s.kt)("td",{parentName:"tr",align:null},"Dual Simplex"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"x"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mfrac",{parentName:"mrow"},(0,s.kt)("mn",{parentName:"mfrac"},"1"),(0,s.kt)("mn",{parentName:"mfrac"},"2")),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"3")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x + \\frac{1}{2}y \\leq 3")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1.1901em",verticalAlign:"-0.345em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mopen nulldelimiter"}),(0,s.kt)("span",{parentName:"span",className:"mfrac"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.8451em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-2.655em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))),(0,s.kt)("span",{parentName:"span",style:{top:"-3.23em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"frac-line",style:{borderBottomWidth:"0.04em"}})),(0,s.kt)("span",{parentName:"span",style:{top:"-3.394em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"1"))))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.345em"}},(0,s.kt)("span",{parentName:"span"}))))),(0,s.kt)("span",{parentName:"span",className:"mclose nulldelimiter"})),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"LIA"),(0,s.kt)("td",{parentName:"tr",align:null},"Linear Integer Arithmetic"),(0,s.kt)("td",{parentName:"tr",align:null},"CutSat"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"a"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mn",{parentName:"mrow"},"3"),(0,s.kt)("mi",{parentName:"mrow"},"b"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"3")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"a + 3b \\leq 3")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8304em",verticalAlign:"-0.136em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"b"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"LIRA"),(0,s.kt)("td",{parentName:"tr",align:null},"Mixed Real/Integer"),(0,s.kt)("td",{parentName:"tr",align:null},"Cuts + Branch"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"x"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mi",{parentName:"mrow"},"a"),(0,s.kt)("mo",{parentName:"mrow"},"\u2265"),(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x + a \\geq 4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.7719em",verticalAlign:"-0.136em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2265"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"IDL"),(0,s.kt)("td",{parentName:"tr",align:null},"Integer Difference Logic"),(0,s.kt)("td",{parentName:"tr",align:null},"Floyd-Warshall"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"a"),(0,s.kt)("mo",{parentName:"mrow"},"\u2212"),(0,s.kt)("mi",{parentName:"mrow"},"b"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"a - b \\leq 4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u2212"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8304em",verticalAlign:"-0.136em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"b"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"RDL"),(0,s.kt)("td",{parentName:"tr",align:null},"Real Difference Logic"),(0,s.kt)("td",{parentName:"tr",align:null},"Bellman-Ford"),(0,s.kt)("td",{parentName:"tr",align:null})),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"UTVPI"),(0,s.kt)("td",{parentName:"tr",align:null},"Unit two-variable per inequality"),(0,s.kt)("td",{parentName:"tr",align:null}),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"x"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x + y \\leq 4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8304em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"NRA"),(0,s.kt)("td",{parentName:"tr",align:null},"Polynomial Real Arithmetic"),(0,s.kt)("td",{parentName:"tr",align:null},"Model based CAD, Incremental Linearization"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("msup",{parentName:"mrow"},(0,s.kt)("mi",{parentName:"msup"},"x"),(0,s.kt)("mn",{parentName:"msup"},"2")),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("msup",{parentName:"mrow"},(0,s.kt)("mi",{parentName:"msup"},"y"),(0,s.kt)("mn",{parentName:"msup"},"2")),(0,s.kt)("mo",{parentName:"mrow"},"<"),(0,s.kt)("mn",{parentName:"mrow"},"1")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x^2 + y^2 < 1")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8974em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.8141em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.063em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1.0085em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.8141em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.063em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"<"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"1"))))))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/073a52b7.7b2ca748.js b/assets/js/073a52b7.7b2ca748.js deleted file mode 100644 index 495f5c460..000000000 --- a/assets/js/073a52b7.7b2ca748.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9612],{4218:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=t(7462),s=(t(7294),t(3905)),r=t(7634),m=t.n(r);const i={title:"Arithmetic",sidebar_position:1},l=void 0,o={unversionedId:"theories/Arithmetic",id:"theories/Arithmetic",title:"Arithmetic",description:"Z3 supports the theory of arithmetic described in the following places.",source:"@site/docs-smtlib/02 - theories/01 - Arithmetic.md",sourceDirName:"02 - theories",slug:"/theories/Arithmetic",permalink:"/z3guide/docs/theories/Arithmetic",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/01 - Arithmetic.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Arithmetic",sidebar_position:1},sidebar:"smtlibSidebar",previous:{title:"Conclusion",permalink:"/z3guide/docs/logic/Conclusion"},next:{title:"Bitvectors",permalink:"/z3guide/docs/theories/Bitvectors"}},p={},c=[{value:"Basics",id:"basics",level:2},{value:"Difference Arithmetic",id:"difference-arithmetic",level:2},{value:"Non-linear arithmetic",id:"non-linear-arithmetic",level:2},{value:"Division",id:"division",level:2},{value:"Algorithmic Fragments of Arithmetic",id:"algorithmic-fragments-of-arithmetic",level:2}],d={toc:c};function h(e){let{components:a,...t}=e;return(0,s.kt)("wrapper",(0,n.Z)({},d,t,{components:a,mdxType:"MDXLayout"}),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Z3 supports the theory of arithmetic described in the following places."),(0,s.kt)("blockquote",{parentName:"admonition"},(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-Ints.shtml"},(0,s.kt)("strong",{parentName:"a"},"SMTLIB2")," standard Integers"))),(0,s.kt)("blockquote",{parentName:"admonition"},(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-Reals.shtml"},(0,s.kt)("strong",{parentName:"a"},"SMTLIB2")," standard Reals"))),(0,s.kt)("blockquote",{parentName:"admonition"},(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-Reals_Ints.shtml"},(0,s.kt)("strong",{parentName:"a"},"SMTLIB2")," standard Mixed Int Reals")))),(0,s.kt)("h2",{id:"basics"},"Basics"),(0,s.kt)("p",null,"Z3 has built-in support for integer and real constants. These two types should not be confused with machine integers (32-bit or 64-bit) and floating point numbers. These two types (sorts) represent the mathematical integers and reals. The command ",(0,s.kt)("inlineCode",{parentName:"p"},"declare-const")," is used to declare integer and real constants."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(declare-const d Real)\n(declare-const e Real)",result:{output:"",error:"",status:"z3-ran",hash:"84b5e01e5572d60505f61498e8aaddb094c3cb47"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"After constants are declared, the user can assert formulas containing that use these constants and arithmetic operators such as +, -, *, etc. The ",(0,s.kt)("inlineCode",{parentName:"p"},"check-sat")," command instructs Z3 to try to find an interpretation for the declared constants that makes all formulas true. The interpretation is basically assigning a number to each constant. If such interpretation exists, we say it is a model for the asserted formulas. The command ",(0,s.kt)("inlineCode",{parentName:"p"},"get-model")," displays the model built by Z3."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(declare-const d Real)\n(declare-const e Real)\n(assert (< a (+ b 2)))\n(assert (= a (+ (* 2 c) 10)))\n(assert (= (+ c b) 1000))\n(assert (= d e))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun b () Int\n 670)\n (define-fun a () Int\n 670)\n (define-fun c () Int\n 330)\n (define-fun e () Real\n 0.0)\n (define-fun d () Real\n 0.0)\n)\n",error:"",status:"z3-ran",hash:"d8aff7daba3c4900cac142c61a83fb1950c10b34"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Real constants should contain a decimal point. Unlike most programming languages, Z3 will not convert automatically integers into reals and vice-versa. The function to-real can be used to convert an integer expression into a real one."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(declare-const d Real)\n(declare-const e Real)\n(assert (< e (+ (to_real (+ a b)) 2.0)))\n(assert (= d (+ (to_real c) 0.5)))\n(assert (< a b))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun e () Real\n 2.0)\n (define-fun b () Int\n 1)\n (define-fun a () Int\n 0)\n (define-fun c () Int\n 0)\n (define-fun d () Real\n (/ 1.0 2.0))\n)\n",error:"",status:"z3-ran",hash:"aa7a9e1f2a4470d684908118f342a9084110afb2"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Some operators are chainable. This includes comparison operators such as ",(0,s.kt)("inlineCode",{parentName:"p"},"<")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"<="),". "),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const b Int)\n(declare-const c Int)\n(assert (< a b c))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun c () Int\n 1)\n (define-fun a () Int\n (- 1))\n (define-fun b () Int\n 0)\n)\n",error:"",status:"z3-ran",hash:"ee18ba5381337b4da6be96d31b91d5c824c89521"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"We can use mixed constraints to ask questions on how reals behave under rounding.\nThe following query considers when the sum of two integers, x, y are above a constant ",(0,s.kt)("inlineCode",{parentName:"p"},"a"),",\nwhile the sum of two reals are below ",(0,s.kt)("inlineCode",{parentName:"p"},"a"),". At the same time the integers x, y are within unit distance\nto the integers. "),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const xR Real)\n(declare-const yR Real)\n(declare-const x Int)\n(declare-const y Int)\n(declare-const a Int)\n\n(assert (< (+ xR yR) a))\n(assert (> (+ x y) a))\n(assert (or (= x xR) (< x xR (+ x 1)) (< (- x 1) xR x)))\n(assert (or (= y yR) (< y yR (+ y 1)) (< (- y 1) yR y)))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun a () Int\n 0)\n (define-fun x () Int\n 1)\n (define-fun xR () Real\n (/ 2.0 3.0))\n (define-fun yR () Real\n (- (/ 5.0 6.0)))\n (define-fun y () Int\n 0)\n)\n",error:"",status:"z3-ran",hash:"2042371221822ffee039176bffa419b6fdac82f9"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"difference-arithmetic"},"Difference Arithmetic"),(0,s.kt)("p",null,"Many problem classes use only limited set of arithmetical constraints. One such class is job-shop scheduling constraints.\nSimpler instances can be encoded and solved using SMT, while advanced uses of job shop scheduling problems do not\nhave efficient encodings directly into arithmetic. For job-shop problems tasks have start time, duration and constraints\nspecifying whether tasks should not overlap and ordering. To specify ordering and overlap constraints require\ncomparing just two time points separated by a constant offset. Comparisons of this form fall within the class\nof ",(0,s.kt)("em",{parentName:"p"},"difference arithmetic")," constraints. "),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(set-logic QF_IDL) ; optional in Z3\n(declare-fun t11 () Int)\n(declare-fun t12 () Int)\n(declare-fun t21 () Int)\n(declare-fun t22 () Int)\n(declare-fun t31 () Int)\n(declare-fun t32 () Int)\n\n(assert (and (>= t11 0) (>= t12 (+ t11 2)) (<= (+ t12 1) 8)))\n(assert (and (>= t21 0) (>= t22 (+ t21 3)) (<= (+ t22 1) 8)))\n(assert (and (>= t31 0) (>= t32 (+ t31 2)) (<= (+ t32 3) 8)))\n(assert (or (>= t11 (+ t21 3)) (>= t21 (+ t11 2))))\n(assert (or (>= t11 (+ t31 2)) (>= t31 (+ t11 2))))\n(assert (or (>= t21 (+ t31 2)) (>= t31 (+ t21 3))))\n(assert (or (>= t12 (+ t22 1)) (>= t22 (+ t12 1))))\n(assert (or (>= t12 (+ t32 3)) (>= t32 (+ t12 1))))\n(assert (or (>= t22 (+ t32 3)) (>= t32 (+ t22 1))))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun t22 () Int\n 5)\n (define-fun t12 () Int\n 7)\n (define-fun t11 () Int\n 5)\n (define-fun t31 () Int\n 0)\n (define-fun t21 () Int\n 2)\n (define-fun t32 () Int\n 2)\n)\n",error:"",status:"z3-ran",hash:"87d782a1124874298a3956fa5c37f2dcd607b7a5"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"In the example we model three jobs, each job has two tasks\nto be completed by two workers. Thus, there are six variables for every task/worker combination.\nThe start time of job 1 on worker 2 is given by ",(0,s.kt)("inlineCode",{parentName:"p"},"t12"),". It has duration 1, so has to start at least one unit before\nthe completion deadline 8. It follows task ",(0,s.kt)("inlineCode",{parentName:"p"},"t11")," which has duration 2 and cannot overlap with other tasks on work station 2."),(0,s.kt)("h2",{id:"non-linear-arithmetic"},"Non-linear arithmetic"),(0,s.kt)("p",null,"We say a formula is nonlinear if it contains expressions of the form (* t s) where t and s are not numbers. Nonlinear real arithmetic is very expensive, and Z3 is not complete for this kind of formula. The command check-sat may return unknown or loop. Nonlinear integer arithmetic is undecidable there is no procedure that is correct and terminates (for every input) with a sat or unsat answer. Yes, it is impossible to build such procedure. Note that, this does not prevent Z3 from returning an answer for many nonlinear problems. The real limit is that there will always be a nonlinear integer arithmetic formula that it will fail produce an answer."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a Int)\n(assert (< (* a a) 3))\n(check-sat)\n(get-model)\n\n(echo "Z3 does not always find solutions to non-linear problems")\n(declare-const b Real)\n(declare-const c Real)\n(assert (= (+ (* b b b) (sin (* b c))) 7))\n(check-sat)\n\n(echo "yet it can show unsatisfiability for some nontrivial nonlinear problems...")\n(declare-const x Real)\n(declare-const y Real)\n(declare-const z Real)\n(assert (= (* x x) (+ x 2.0)))\n(assert (= (* x y) x))\n(assert (= (* (- y 1.0) z) 1.0))\n(check-sat)\n\n(reset)\n(echo "When presented only non-linear polynomial constraints over reals, Z3 uses a specialized complete solver")\n(declare-const b Real)\n(declare-const c Real)\n(assert (= (+ (* b b b) (* b c)) 3.0))\n(check-sat)\n(get-model)',result:{output:"sat\n(\n (define-fun a () Int\n 0)\n)\nZ3 does not always find solutions to non-linear problems\nunknown\nyet it can show unsatisfiability for some nontrivial nonlinear problems...\nunsat\nWhen presented only non-linear polynomial constraints over reals, Z3 uses a specialized complete solver\nsat\n(\n (define-fun b () Real\n (/ 1.0 8.0))\n (define-fun c () Real\n (/ 1535.0 64.0))\n)\n",error:"",status:"z3-ran",hash:"eef0f44fae446a64135b49b3b8056fc9da9dbf48"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"division"},"Division"),(0,s.kt)("p",null,"Z3 also has support for division, integer division, modulo and remainder operators. Internally, they are all mapped to multiplication."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Int)\n(declare-const r1 Int)\n(declare-const r2 Int)\n(declare-const r3 Int)\n(declare-const r4 Int)\n(declare-const r5 Int)\n(declare-const r6 Int)\n(assert (= a 10))\n(assert (= r1 (div a 4))) ; integer division\n(assert (= r2 (mod a 4))) ; mod\n(assert (= r3 (rem a 4))) ; remainder\n(assert (= r4 (div a (- 4)))) ; integer division\n(assert (= r5 (mod a (- 4)))) ; mod\n(assert (= r6 (rem a (- 4)))) ; remainder\n(declare-const b Real)\n(declare-const c Real)\n(assert (= b (/ c 3.0)))\n(assert (= c 20.0))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun r4 () Int\n (- 2))\n (define-fun r5 () Int\n 2)\n (define-fun r6 () Int\n (- 2))\n (define-fun r3 () Int\n 2)\n (define-fun b () Real\n (/ 20.0 3.0))\n (define-fun r2 () Int\n 2)\n (define-fun r1 () Int\n 2)\n (define-fun c () Real\n 20.0)\n (define-fun a () Int\n 10)\n)\n",error:"",status:"z3-ran",hash:"532b4209c39f259fada8ea4f438afdc1efcd2557"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"In Z3, division by zero is allowed, but the result is not specified. Division is not a partial function.\nActually, in Z3 all functions are total, although the result may be under-specified in some cases like division by zero."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"We say that an interpreted function (such as ",(0,s.kt)("inlineCode",{parentName:"p"},"/"),") is ",(0,s.kt)("em",{parentName:"p"},"under-specified")," when the meaning of the function is not fixed on all values\nof arguments. The division, modulus and remainder functions are ",(0,s.kt)("em",{parentName:"p"},"under-specified")," when the second argument is 0. Constraints that\nallow the second arguments to these functions to be 0 can still be satisfiable when there are interpretations of the functions\nat 0 that satisfy the constraints.")),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Real)\n; The following formula is satisfiable since division by zero is not specified.\n(assert (= (/ a 0.0) 10.0)) \n(check-sat)\n(get-model)\n\n; Although division by zero is not specified, division is still a function.\n; Therefore, (/ a 0.0) cannot evaluate to both 10.0 and 2.0.\n(assert (= (/ a 0.0) 2.0)) \n(check-sat)",result:{output:"sat\n(\n (define-fun a () Real\n 38.0)\n (define-fun /0 ((x!0 Real) (x!1 Real)) Real\n 10.0)\n)\nunsat\n",error:"",status:"z3-ran",hash:"3298c16f127d570132fd7fba8482a7525e428bdd"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"If you are not happy with this behavior, you may use the ",(0,s.kt)("inlineCode",{parentName:"p"},"ite")," (if-then-else) operator to guard every division, and assign whatever interpretation you like to the division by zero. This example uses define-fun constructor to create a new operator mydiv. This is essentially a macro, and Z3 will expand its definition for every application of mydiv."),(0,s.kt)(m(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"; defining my own division operator where x0.0 == 0.0 for every x.\n(define-fun mydiv ((x Real) (y Real)) Real\n (if (not (= y 0.0))\n (/ x y)\n 0.0))\n(declare-const a Real)\n(declare-const b Real)\n(assert (= (mydiv a b) 1.0))\n(assert (= b 0.0))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"888b584c6554dcc3ae0f65d16e7e4449c228df98"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"algorithmic-fragments-of-arithmetic"},"Algorithmic Fragments of Arithmetic"),(0,s.kt)("p",null,"Z3 contains a combination of several engines for solving arithmetic formulas.\nThe engines are invoked based on the shape of arithmetic formulas.\nFor linear real arithmetic formulas it uses dual simplex to determine feasibility.\nFor linear integer arithmetic formulas it uses techniques from integer programming: cuts and branch and bound.\nThere are specialized solvers for different arithmetic fragments and, finally, for non-linear arithmetic\nconstraints z3 contains several small hammers that integrate Grobner basis simplifications, bounds propagation,\nnon-linear cylindric algebraic decomposition and reducing non-linear constraints to linear form by sampling at tangent points."),(0,s.kt)("table",null,(0,s.kt)("thead",{parentName:"table"},(0,s.kt)("tr",{parentName:"thead"},(0,s.kt)("th",{parentName:"tr",align:null},"Logic"),(0,s.kt)("th",{parentName:"tr",align:null},"Fragment"),(0,s.kt)("th",{parentName:"tr",align:null},"Solver"),(0,s.kt)("th",{parentName:"tr",align:null},"Example"))),(0,s.kt)("tbody",{parentName:"table"},(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"LRA"),(0,s.kt)("td",{parentName:"tr",align:null},"Linear Real Arithmetic"),(0,s.kt)("td",{parentName:"tr",align:null},"Dual Simplex"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"x"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mfrac",{parentName:"mrow"},(0,s.kt)("mn",{parentName:"mfrac"},"1"),(0,s.kt)("mn",{parentName:"mfrac"},"2")),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"3")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x + \\frac{1}{2}y \\leq 3")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1.1901em",verticalAlign:"-0.345em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mopen nulldelimiter"}),(0,s.kt)("span",{parentName:"span",className:"mfrac"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.8451em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-2.655em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))),(0,s.kt)("span",{parentName:"span",style:{top:"-3.23em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"frac-line",style:{borderBottomWidth:"0.04em"}})),(0,s.kt)("span",{parentName:"span",style:{top:"-3.394em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"1"))))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.345em"}},(0,s.kt)("span",{parentName:"span"}))))),(0,s.kt)("span",{parentName:"span",className:"mclose nulldelimiter"})),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"LIA"),(0,s.kt)("td",{parentName:"tr",align:null},"Linear Integer Arithmetic"),(0,s.kt)("td",{parentName:"tr",align:null},"CutSat"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"a"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mn",{parentName:"mrow"},"3"),(0,s.kt)("mi",{parentName:"mrow"},"b"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"3")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"a + 3b \\leq 3")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8304em",verticalAlign:"-0.136em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"b"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"LIRA"),(0,s.kt)("td",{parentName:"tr",align:null},"Mixed Real/Integer"),(0,s.kt)("td",{parentName:"tr",align:null},"Cuts + Branch"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"x"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mi",{parentName:"mrow"},"a"),(0,s.kt)("mo",{parentName:"mrow"},"\u2265"),(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x + a \\geq 4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.7719em",verticalAlign:"-0.136em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2265"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"IDL"),(0,s.kt)("td",{parentName:"tr",align:null},"Integer Difference Logic"),(0,s.kt)("td",{parentName:"tr",align:null},"Floyd-Warshall"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"a"),(0,s.kt)("mo",{parentName:"mrow"},"\u2212"),(0,s.kt)("mi",{parentName:"mrow"},"b"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"a - b \\leq 4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u2212"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8304em",verticalAlign:"-0.136em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"b"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"RDL"),(0,s.kt)("td",{parentName:"tr",align:null},"Real Difference Logic"),(0,s.kt)("td",{parentName:"tr",align:null},"Bellman-Ford"),(0,s.kt)("td",{parentName:"tr",align:null})),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"UTVPI"),(0,s.kt)("td",{parentName:"tr",align:null},"Unit two-variable per inequality"),(0,s.kt)("td",{parentName:"tr",align:null}),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"x"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow"},"\u2264"),(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x + y \\leq 4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6667em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8304em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2264"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},"NRA"),(0,s.kt)("td",{parentName:"tr",align:null},"Polynomial Real Arithmetic"),(0,s.kt)("td",{parentName:"tr",align:null},"Model based CAD, Incremental Linearization"),(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("span",{parentName:"td",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("msup",{parentName:"mrow"},(0,s.kt)("mi",{parentName:"msup"},"x"),(0,s.kt)("mn",{parentName:"msup"},"2")),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("msup",{parentName:"mrow"},(0,s.kt)("mi",{parentName:"msup"},"y"),(0,s.kt)("mn",{parentName:"msup"},"2")),(0,s.kt)("mo",{parentName:"mrow"},"<"),(0,s.kt)("mn",{parentName:"mrow"},"1")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"x^2 + y^2 < 1")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8974em",verticalAlign:"-0.0833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"x"),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.8141em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.063em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1.0085em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.8141em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.063em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"<"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"1"))))))))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0eeec111.05622b3e.js b/assets/js/0eeec111.05622b3e.js deleted file mode 100644 index e87ec2c2c..000000000 --- a/assets/js/0eeec111.05622b3e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7593],{2137:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>p,toc:()=>m});var r=n(7462),a=(n(7294),n(3905)),i=n(7634),s=n.n(i);const o={title:"Regular Expressions",sidebar_position:8},l=void 0,p={unversionedId:"theories/Regular Expressions",id:"theories/Regular Expressions",title:"Regular Expressions",description:"SMTLIB2 standard The theory of unicode strings and regular expressions",source:"@site/docs-smtlib/02 - theories/08 - Regular Expressions.md",sourceDirName:"02 - theories",slug:"/theories/Regular Expressions",permalink:"/z3guide/docs/theories/Regular Expressions",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/08 - Regular Expressions.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"Regular Expressions",sidebar_position:8},sidebar:"smtlibSidebar",previous:{title:"Sequences",permalink:"/z3guide/docs/theories/Sequences"},next:{title:"Unicode Characters",permalink:"/z3guide/docs/theories/Characters"}},d={},m=[],u={toc:m};function g(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},(0,a.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,a.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-UnicodeStrings.shtml"},"The theory of unicode strings and regular expressions"))),(0,a.kt)("p",null,"The sort constructor ",(0,a.kt)("inlineCode",{parentName:"p"},"RegEx")," takes as argument a sequence type.\nThe set of regular expressions over strings is thus ",(0,a.kt)("inlineCode",{parentName:"p"},"(RegEx String)"),";\nit is synonymous with the sort ",(0,a.kt)("inlineCode",{parentName:"p"},"RegLan")," defined in the ",(0,a.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-UnicodeStrings.shtml"},"SMTLIB2 format"),"."),(0,a.kt)("h1",{id:"summary-of-operations"},"Summary of Operations"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Operation"),(0,a.kt)("th",{parentName:"tr",align:null},"Brief Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(str.to.re s)")),(0,a.kt)("td",{parentName:"tr",align:null},"Convert string to regular expression accepting ",(0,a.kt)("inlineCode",{parentName:"td"},"s"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(str.in.re s r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Determine if ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," is in the language generated by ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"re.allchar")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression accepting every string")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"re.nostr")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression rejecting every string")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.range ch1 ch2)")),(0,a.kt)("td",{parentName:"tr",align:null},"The range of characters (represented as strings) between ",(0,a.kt)("inlineCode",{parentName:"td"},"ch1")," and ",(0,a.kt)("inlineCode",{parentName:"td"},"ch2"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.++ r1 r2 r3)")),(0,a.kt)("td",{parentName:"tr",align:null},"Concatenation of regular expressions")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.* r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Kleene star")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.+ r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Kleene plus")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.opt r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Zero or one use of ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"((_ re.loop lo hi) r)")),(0,a.kt)("td",{parentName:"tr",align:null},"from ",(0,a.kt)("inlineCode",{parentName:"td"},"lo")," to ",(0,a.kt)("inlineCode",{parentName:"td"},"hi")," number of repetitions of ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.union r1 r2)")),(0,a.kt)("td",{parentName:"tr",align:null},"The union of regular languages")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.inter r1 r2)")),(0,a.kt)("td",{parentName:"tr",align:null},"The intersection of regular languages")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(seq.to.re s)")),(0,a.kt)("td",{parentName:"tr",align:null},"Convert sequence to regular expression accepting ",(0,a.kt)("inlineCode",{parentName:"td"},"s"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(seq.in.re s r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Determine if sequence ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," is in the language generated by ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(as re.all R)")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression of sort ",(0,a.kt)("inlineCode",{parentName:"td"},"R")," accepting every sequence")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(as re.empty R)")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression of sort ",(0,a.kt)("inlineCode",{parentName:"td"},"R")," rejecting every sequence")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.of.prop p)")),(0,a.kt)("td",{parentName:"tr",align:null},"Sequences of length 1 where character satisfies predicate ",(0,a.kt)("inlineCode",{parentName:"td"},"p"),". The sort of ",(0,a.kt)("inlineCode",{parentName:"td"},"p")," is ",(0,a.kt)("inlineCode",{parentName:"td"},"(Array C Bool)"),", where ",(0,a.kt)("inlineCode",{parentName:"td"},"C")," is the character sort.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.replace_re s r dst)")),(0,a.kt)("td",{parentName:"tr",align:null},"Currently not supported: replace left-most smallest occurrence matching ",(0,a.kt)("inlineCode",{parentName:"td"},"r")," in ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," by ",(0,a.kt)("inlineCode",{parentName:"td"},"dst"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.replace_re_all s r dst)")),(0,a.kt)("td",{parentName:"tr",align:null},"Currently not supported: replace, traversing left-to-right, smallest matches, all occurrences matching ",(0,a.kt)("inlineCode",{parentName:"td"},"r")," in ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," by ",(0,a.kt)("inlineCode",{parentName:"td"},"dst"))))),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"re.range")," operator expects two strings each encoding a single character.\nFor example ",(0,a.kt)("inlineCode",{parentName:"p"},'(re.range "a" "\\u{ff}")')," is a valid range of characters,\nwhile ",(0,a.kt)("inlineCode",{parentName:"p"},'(re.range "aa" "")')," is the empty language. "),(0,a.kt)(s(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (re.range "a" "\\u{ff}"))\n(simplify (re.range "aa" ""))',result:{output:'(re.range "a" "\\u{ff}")\nre.none\n',error:"",status:"z3-ran",hash:"dce20a9f415149bd6570baf130f2ae13051bc383"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("p",null,"For compatibility with the SMTLIB2 format\nZ3 also accepts expressions of the form ",(0,a.kt)("inlineCode",{parentName:"p"},"(re.loop r lo hi)"),".\nZ3 understands only the meaning of these terms when ",(0,a.kt)("inlineCode",{parentName:"p"},"lo, hi")," are\ninteger numerals."),(0,a.kt)("h1",{id:"what-not-to-expect-of-regular-expressions"},"What (not) to expect of regular expressions"),(0,a.kt)("p",null,"The default solver for regular expressions unfolds membership relations of regular expressions lazily.\nIt uses ",(0,a.kt)("a",{parentName:"p",href:"https://dl.acm.org/doi/abs/10.1145/3453483.3454066"},"symbolic derivatives")," .\nThis approach works for many membership and non-membership constraints, but is not a complete\nprocedure when membership constraints are combined with constraints over strings.\nNote that the syntax allows forming ",(0,a.kt)("em",{parentName:"p"},"symbolic")," regular expressions that contain uninterpreted non-terminals.\nIt also does not handle regular expressions symbolic sequences (it allows\nto express non-regular languages).\nThus, the string ",(0,a.kt)("inlineCode",{parentName:"p"},"s")," in ",(0,a.kt)("inlineCode",{parentName:"p"},"(str.to.re s)")," should be\na string literal. You can write formulas with equalities over\nregular expressions. Z3 is a decision procedure for equalities and disequalities between non-symbolic regular expressions."),(0,a.kt)("h1",{id:"examples"},"Examples"),(0,a.kt)("p",null,"The maximal length is 6 for a string of length 2 repeated at most 3 times."),(0,a.kt)(s(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(push)\n(set-info :status sat)\n(assert (str.in.re a ((_ re.loop 1 3) (str.to.re "ab"))))\n(assert (= (str.len a) 6))\n(check-sat)\n(get-model)\n(pop)\n\n(push)\n(set-info :status unsat)\n(assert (str.in.re a ((_ re.loop 1 3) (str.to.re "ab"))))\n(assert (> (str.len a) 6))\n(check-sat)\n(pop)',result:{output:'sat\n(\n (define-fun a () String\n "ababab")\n)\nunsat\n',error:"",status:"z3-ran",hash:"afae13ad5f792e30afcac56b8b65c14ce2c4b670"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0eeec111.bf62afca.js b/assets/js/0eeec111.bf62afca.js new file mode 100644 index 000000000..ed1350b91 --- /dev/null +++ b/assets/js/0eeec111.bf62afca.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7593],{2137:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>p,toc:()=>m});var r=n(7462),a=(n(7294),n(3905)),i=n(7634),s=n.n(i);const o={title:"Regular Expressions",sidebar_position:8},l=void 0,p={unversionedId:"theories/Regular Expressions",id:"theories/Regular Expressions",title:"Regular Expressions",description:"SMTLIB2 standard The theory of unicode strings and regular expressions",source:"@site/docs-smtlib/02 - theories/08 - Regular Expressions.md",sourceDirName:"02 - theories",slug:"/theories/Regular Expressions",permalink:"/z3guide/docs/theories/Regular Expressions",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/08 - Regular Expressions.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"Regular Expressions",sidebar_position:8},sidebar:"smtlibSidebar",previous:{title:"Sequences",permalink:"/z3guide/docs/theories/Sequences"},next:{title:"Unicode Characters",permalink:"/z3guide/docs/theories/Characters"}},d={},m=[],u={toc:m};function g(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},(0,a.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,a.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-UnicodeStrings.shtml"},"The theory of unicode strings and regular expressions"))),(0,a.kt)("p",null,"The sort constructor ",(0,a.kt)("inlineCode",{parentName:"p"},"RegEx")," takes as argument a sequence type.\nThe set of regular expressions over strings is thus ",(0,a.kt)("inlineCode",{parentName:"p"},"(RegEx String)"),";\nit is synonymous with the sort ",(0,a.kt)("inlineCode",{parentName:"p"},"RegLan")," defined in the ",(0,a.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-UnicodeStrings.shtml"},"SMTLIB2 format"),"."),(0,a.kt)("h1",{id:"summary-of-operations"},"Summary of Operations"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Operation"),(0,a.kt)("th",{parentName:"tr",align:null},"Brief Description"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(str.to.re s)")),(0,a.kt)("td",{parentName:"tr",align:null},"Convert string to regular expression accepting ",(0,a.kt)("inlineCode",{parentName:"td"},"s"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(str.in.re s r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Determine if ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," is in the language generated by ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"re.allchar")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression accepting every string")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"re.nostr")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression rejecting every string")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.range ch1 ch2)")),(0,a.kt)("td",{parentName:"tr",align:null},"The range of characters (represented as strings) between ",(0,a.kt)("inlineCode",{parentName:"td"},"ch1")," and ",(0,a.kt)("inlineCode",{parentName:"td"},"ch2"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.++ r1 r2 r3)")),(0,a.kt)("td",{parentName:"tr",align:null},"Concatenation of regular expressions")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.* r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Kleene star")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.+ r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Kleene plus")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.opt r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Zero or one use of ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"((_ re.loop lo hi) r)")),(0,a.kt)("td",{parentName:"tr",align:null},"from ",(0,a.kt)("inlineCode",{parentName:"td"},"lo")," to ",(0,a.kt)("inlineCode",{parentName:"td"},"hi")," number of repetitions of ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.union r1 r2)")),(0,a.kt)("td",{parentName:"tr",align:null},"The union of regular languages")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.inter r1 r2)")),(0,a.kt)("td",{parentName:"tr",align:null},"The intersection of regular languages")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(seq.to.re s)")),(0,a.kt)("td",{parentName:"tr",align:null},"Convert sequence to regular expression accepting ",(0,a.kt)("inlineCode",{parentName:"td"},"s"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(seq.in.re s r)")),(0,a.kt)("td",{parentName:"tr",align:null},"Determine if sequence ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," is in the language generated by ",(0,a.kt)("inlineCode",{parentName:"td"},"r"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(as re.all R)")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression of sort ",(0,a.kt)("inlineCode",{parentName:"td"},"R")," accepting every sequence")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(as re.empty R)")),(0,a.kt)("td",{parentName:"tr",align:null},"The regular expression of sort ",(0,a.kt)("inlineCode",{parentName:"td"},"R")," rejecting every sequence")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.of.prop p)")),(0,a.kt)("td",{parentName:"tr",align:null},"Sequences of length 1 where character satisfies predicate ",(0,a.kt)("inlineCode",{parentName:"td"},"p"),". The sort of ",(0,a.kt)("inlineCode",{parentName:"td"},"p")," is ",(0,a.kt)("inlineCode",{parentName:"td"},"(Array C Bool)"),", where ",(0,a.kt)("inlineCode",{parentName:"td"},"C")," is the character sort.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.replace_re s r dst)")),(0,a.kt)("td",{parentName:"tr",align:null},"Currently not supported: replace left-most smallest occurrence matching ",(0,a.kt)("inlineCode",{parentName:"td"},"r")," in ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," by ",(0,a.kt)("inlineCode",{parentName:"td"},"dst"))),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(re.replace_re_all s r dst)")),(0,a.kt)("td",{parentName:"tr",align:null},"Currently not supported: replace, traversing left-to-right, smallest matches, all occurrences matching ",(0,a.kt)("inlineCode",{parentName:"td"},"r")," in ",(0,a.kt)("inlineCode",{parentName:"td"},"s")," by ",(0,a.kt)("inlineCode",{parentName:"td"},"dst"))))),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"re.range")," operator expects two strings each encoding a single character.\nFor example ",(0,a.kt)("inlineCode",{parentName:"p"},'(re.range "a" "\\u{ff}")')," is a valid range of characters,\nwhile ",(0,a.kt)("inlineCode",{parentName:"p"},'(re.range "aa" "")')," is the empty language. "),(0,a.kt)(s(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (re.range "a" "\\u{ff}"))\n(simplify (re.range "aa" ""))',result:{output:'(re.range "a" "\\u{ff}")\nre.none\n',error:"",status:"z3-ran",hash:"dce20a9f415149bd6570baf130f2ae13051bc383"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("p",null,"For compatibility with the SMTLIB2 format\nZ3 also accepts expressions of the form ",(0,a.kt)("inlineCode",{parentName:"p"},"(re.loop r lo hi)"),".\nZ3 understands only the meaning of these terms when ",(0,a.kt)("inlineCode",{parentName:"p"},"lo, hi")," are\ninteger numerals."),(0,a.kt)("h1",{id:"what-not-to-expect-of-regular-expressions"},"What (not) to expect of regular expressions"),(0,a.kt)("p",null,"The default solver for regular expressions unfolds membership relations of regular expressions lazily.\nIt uses ",(0,a.kt)("a",{parentName:"p",href:"https://dl.acm.org/doi/abs/10.1145/3453483.3454066"},"symbolic derivatives")," .\nThis approach works for many membership and non-membership constraints, but is not a complete\nprocedure when membership constraints are combined with constraints over strings.\nNote that the syntax allows forming ",(0,a.kt)("em",{parentName:"p"},"symbolic")," regular expressions that contain uninterpreted non-terminals.\nIt also does not handle regular expressions symbolic sequences (it allows\nto express non-regular languages).\nThus, the string ",(0,a.kt)("inlineCode",{parentName:"p"},"s")," in ",(0,a.kt)("inlineCode",{parentName:"p"},"(str.to.re s)")," should be\na string literal. You can write formulas with equalities over\nregular expressions. Z3 is a decision procedure for equalities and disequalities between non-symbolic regular expressions."),(0,a.kt)("h1",{id:"examples"},"Examples"),(0,a.kt)("p",null,"The maximal length is 6 for a string of length 2 repeated at most 3 times."),(0,a.kt)(s(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(push)\n(set-info :status sat)\n(assert (str.in.re a ((_ re.loop 1 3) (str.to.re "ab"))))\n(assert (= (str.len a) 6))\n(check-sat)\n(get-model)\n(pop)\n\n(push)\n(set-info :status unsat)\n(assert (str.in.re a ((_ re.loop 1 3) (str.to.re "ab"))))\n(assert (> (str.len a) 6))\n(check-sat)\n(pop)',result:{output:'sat\n(\n (define-fun a () String\n "ababab")\n)\nunsat\n',error:"",status:"z3-ran",hash:"afae13ad5f792e30afcac56b8b65c14ce2c4b670"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/54fd2156.2f24fcd6.js b/assets/js/54fd2156.448b1055.js similarity index 83% rename from assets/js/54fd2156.2f24fcd6.js rename to assets/js/54fd2156.448b1055.js index 956ca8586..9e4bcdc08 100644 --- a/assets/js/54fd2156.2f24fcd6.js +++ b/assets/js/54fd2156.448b1055.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5053],{3697:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var i=o(7462),r=(o(7294),o(3905));o(7634);const n={title:"Introduction",sidebar_position:1},a=void 0,s={unversionedId:"logic/intro",id:"logic/intro",title:"Introduction",description:"Z3 is a state-of-the art theorem prover from Microsoft Research. It can be used to check the satisfiability of logical formulas over one or more theories. Z3 offers a compelling match for software analysis and verification tools, since several common software constructs map directly into supported theories.",source:"@site/docs-smtlib/01 - logic/01 - intro.md",sourceDirName:"01 - logic",slug:"/logic/intro",permalink:"/z3guide/docs/logic/intro",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/01 - logic/01 - intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Introduction",sidebar_position:1},sidebar:"smtlibSidebar",next:{title:"Basic Commands",permalink:"/z3guide/docs/logic/basiccommands"}},l={},c=[{value:"SMTLIB Format",id:"smtlib-format",level:2}],d={toc:c};function m(e){let{components:t,...o}=e;return(0,r.kt)("wrapper",(0,i.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Z3 is a state-of-the art theorem prover from Microsoft Research. It can be used to check the satisfiability of logical formulas over one or more theories. Z3 offers a compelling match for software analysis and verification tools, since several common software constructs map directly into supported theories."),(0,r.kt)("p",null,"The main objective of the tutorial is to introduce the reader on how to use Z3 effectively for logical modeling and solving. The tutorial provides some general background on logical modeling, but we defer a full introduction to first-order logic and decision procedures to text-books, if you want to develop an in-depth understanding of the underlying concepts. To clarify: a deep understanding of logical modeling is not required to understand this tutorial and modeling with Z3, but it is necessary for writing complex models."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("blockquote",{parentName:"admonition"},(0,r.kt)("p",{parentName:"blockquote"},"For an understanding of computational logic from the foundations of first-order logic to state-of-the-art decision procedures for arithmetic, data structures, and combination theories, refer to ",(0,r.kt)("a",{parentName:"p",href:"https://theory.stanford.edu/~arbrad/book.html"},"The Calculus of Computation by Aaron Bradley and Zohar Manna"))),(0,r.kt)("blockquote",{parentName:"admonition"},(0,r.kt)("p",{parentName:"blockquote"},"For an understanding of decision procedures, algorithms that, given a decision problem, terminate with a correct yes or no answer, refer to ",(0,r.kt)("a",{parentName:"p",href:"http://www.decision-procedures.org/"},"Decision Procedures by Daniel Kroening and Ofer Strichman"))),(0,r.kt)("blockquote",{parentName:"admonition"},(0,r.kt)("p",{parentName:"blockquote"},"For an overview of Satisfiability modulo theories (SMT) and Boolean satisfiability problem (SAT) solvers, examples of their theoretical application, and questions to work through, refer to ",(0,r.kt)("a",{parentName:"p",href:"https://sat-smt.codes/SAT_SMT_by_example.pdf"},"SAT/SMT by Example by Dennis Yurichev")," "))),(0,r.kt)("p",null,"Z3 is a low-level tool. It is best used as a component in the context of other tools that require solving logical formulas. Consequently, Z3 exposes a number of API facilities to make it convenient for tools to map into Z3, but there are no stand-alone editors or user-centric facilities for interacting with Z3. The language syntax used in the front ends favor simplicity in contrast to linguistic convenience."),(0,r.kt)("h2",{id:"smtlib-format"},"SMTLIB Format"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"This tutorial uses Z3's frontend for the ",(0,r.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/"},"SMTLIB format"),".")),(0,r.kt)("p",null,"The SMTLIB format is a community standard used by several SMT solvers.\nIt uses LISP-like syntax to make it easy for tools to serialize and de-serialize models.\nOn the flip-side, it is not optimized for human readability.\nThe SMTLIB initiative defines several theories, and Z3 supports all main theories in the SMTLIB2 format.\nThis tutorial cross-references the definitions of theories in relevant sections."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"}," Be sure to follow along with the examples by clicking the edit link in the corner. See what the tool says, try your own formulas, and experiment!")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5053],{3697:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var i=o(7462),r=(o(7294),o(3905));o(7634);const n={title:"Introduction",sidebar_position:1},a=void 0,s={unversionedId:"logic/intro",id:"logic/intro",title:"Introduction",description:"Z3 is a state-of-the art theorem prover from Microsoft Research. It can be used to check the satisfiability of logical formulas over one or more theories. Z3 offers a compelling match for software analysis and verification tools, since several common software constructs map directly into supported theories.",source:"@site/docs-smtlib/01 - logic/01 - intro.md",sourceDirName:"01 - logic",slug:"/logic/intro",permalink:"/z3guide/docs/logic/intro",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/01 - logic/01 - intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Introduction",sidebar_position:1},sidebar:"smtlibSidebar",next:{title:"Basic Commands",permalink:"/z3guide/docs/logic/basiccommands"}},l={},c=[{value:"SMTLIB Format",id:"smtlib-format",level:2}],d={toc:c};function m(e){let{components:t,...o}=e;return(0,r.kt)("wrapper",(0,i.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Z3 is a state-of-the art theorem prover from Microsoft Research. It can be used to check the satisfiability of logical formulas over one or more theories. Z3 offers a compelling match for software analysis and verification tools, since several common software constructs map directly into supported theories."),(0,r.kt)("p",null,"The main objective of the tutorial is to introduce the reader on how to use Z3 effectively for logical modeling and solving. The tutorial provides some general background on logical modeling, but we defer a full introduction to first-order logic and decision procedures to text-books, if you want to develop an in-depth understanding of the underlying concepts. To clarify: a deep understanding of logical modeling is not required to understand this tutorial and modeling with Z3, but it is necessary for writing complex models."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("blockquote",{parentName:"admonition"},(0,r.kt)("p",{parentName:"blockquote"},"For an understanding of computational logic from the foundations of first-order logic to state-of-the-art decision procedures for arithmetic, data structures, and combination theories, refer to ",(0,r.kt)("a",{parentName:"p",href:"https://theory.stanford.edu/~arbrad/book.html"},"The Calculus of Computation by Aaron Bradley and Zohar Manna"))),(0,r.kt)("blockquote",{parentName:"admonition"},(0,r.kt)("p",{parentName:"blockquote"},"For an understanding of decision procedures, algorithms that, given a decision problem, terminate with a correct yes or no answer, refer to ",(0,r.kt)("a",{parentName:"p",href:"http://www.decision-procedures.org/"},"Decision Procedures by Daniel Kroening and Ofer Strichman"))),(0,r.kt)("blockquote",{parentName:"admonition"},(0,r.kt)("p",{parentName:"blockquote"},"For an overview of Satisfiability modulo theories (SMT) and Boolean satisfiability problem (SAT) solvers, examples of their theoretical application, and questions to work through, refer to ",(0,r.kt)("a",{parentName:"p",href:"https://sat-smt.codes/SAT_SMT_by_example.pdf"},"SAT/SMT by Example by Dennis Yurichev")," "))),(0,r.kt)("p",null,"Z3 is a low-level tool. It is best used as a component in the context of other tools that require solving logical formulas. Consequently, Z3 exposes a number of API facilities to make it convenient for tools to map into Z3, but there are no stand-alone editors or user-centric facilities for interacting with Z3. The language syntax used in the front ends favor simplicity in contrast to linguistic convenience."),(0,r.kt)("h2",{id:"smtlib-format"},"SMTLIB Format"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"This tutorial uses Z3's frontend for the ",(0,r.kt)("a",{parentName:"p",href:"https://smt-lib.org/"},"SMTLIB format"),".")),(0,r.kt)("p",null,"The SMTLIB format is a community standard used by several SMT solvers.\nIt uses LISP-like syntax to make it easy for tools to serialize and de-serialize models.\nOn the flip-side, it is not optimized for human readability.\nThe SMTLIB initiative defines several theories, and Z3 supports all main theories in the SMTLIB2 format.\nThis tutorial cross-references the definitions of theories in relevant sections."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"}," Be sure to follow along with the examples by clicking the edit link in the corner. See what the tool says, try your own formulas, and experiment!")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b85c3b2.56e10185.js b/assets/js/5b85c3b2.56e10185.js deleted file mode 100644 index f13f2a4ce..000000000 --- a/assets/js/5b85c3b2.56e10185.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5223],{1106:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>d,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var s=o(7462),n=(o(7294),o(3905)),r=o(7634),i=o.n(r);const a={title:"IEEE Floats",sidebar_position:3},d=void 0,l={unversionedId:"theories/IEEE Floats",id:"theories/IEEE Floats",title:"IEEE Floats",description:"SMTLIB2 standard IEEE Floating Point Numbers",source:"@site/docs-smtlib/02 - theories/03 - IEEE Floats.md",sourceDirName:"02 - theories",slug:"/theories/IEEE Floats",permalink:"/z3guide/docs/theories/IEEE Floats",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/03 - IEEE Floats.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"IEEE Floats",sidebar_position:3},sidebar:"smtlibSidebar",previous:{title:"Bitvectors",permalink:"/z3guide/docs/theories/Bitvectors"},next:{title:"Arrays",permalink:"/z3guide/docs/theories/Arrays"}},u={},c=[],p={toc:c};function f(e){let{components:t,...o}=e;return(0,n.kt)("wrapper",(0,s.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,n.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-FloatingPoint.shtml"},"IEEE Floating Point Numbers"))),(0,n.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-fun X () (_ FloatingPoint 11 53))\n\n(assert (fp.isNormal X))\n(assert (not (fp.isSubnormal X)))\n(assert (not (fp.isZero X)))\n(assert (not (fp.isInfinite X)))\n(assert (not (fp.isNaN X)))\n(assert (not (fp.isNegative X)))\n(assert (fp.isPositive X))\n\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun X () (_ FloatingPoint 11 53)\n (fp #b0 #b00000000001 #x0000000000000))\n)\n",error:"",status:"z3-ran",hash:"fdb30c9d925f690af715dadf8f6f927e72906259"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,n.kt)("p",null,"Floating point operations are defined modulo rounding modes.\nMany algebraic properties of bit-vectors, integers and reals don't carry over to floating points.\nFor example, addition is not associative."),(0,n.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Float32)\n(declare-const b Float32)\n(declare-const c Float32)\n\n(assert (not (= (fp.add roundNearestTiesToEven a (fp.add roundNearestTiesToEven b c))\n\t (fp.add roundNearestTiesToEven (fp.add roundNearestTiesToEven a b) c))))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun a () Float32\n (fp #b1 #x12 #b00111110111010001011000))\n (define-fun c () Float32\n (fp #b0 #x16 #b11111000000000010111010))\n (define-fun b () Float32\n (fp #b1 #x16 #b11101100000100010111010))\n)\n",error:"",status:"z3-ran",hash:"295b57781a52173a0540639e303c74eadc3f8f06"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5b85c3b2.b7062cd0.js b/assets/js/5b85c3b2.b7062cd0.js new file mode 100644 index 000000000..85c7ce015 --- /dev/null +++ b/assets/js/5b85c3b2.b7062cd0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5223],{1106:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>d,default:()=>f,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var s=o(7462),n=(o(7294),o(3905)),r=o(7634),i=o.n(r);const a={title:"IEEE Floats",sidebar_position:3},d=void 0,l={unversionedId:"theories/IEEE Floats",id:"theories/IEEE Floats",title:"IEEE Floats",description:"SMTLIB2 standard IEEE Floating Point Numbers",source:"@site/docs-smtlib/02 - theories/03 - IEEE Floats.md",sourceDirName:"02 - theories",slug:"/theories/IEEE Floats",permalink:"/z3guide/docs/theories/IEEE Floats",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/03 - IEEE Floats.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"IEEE Floats",sidebar_position:3},sidebar:"smtlibSidebar",previous:{title:"Bitvectors",permalink:"/z3guide/docs/theories/Bitvectors"},next:{title:"Arrays",permalink:"/z3guide/docs/theories/Arrays"}},u={},c=[],p={toc:c};function f(e){let{components:t,...o}=e;return(0,n.kt)("wrapper",(0,s.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,n.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-FloatingPoint.shtml"},"IEEE Floating Point Numbers"))),(0,n.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-fun X () (_ FloatingPoint 11 53))\n\n(assert (fp.isNormal X))\n(assert (not (fp.isSubnormal X)))\n(assert (not (fp.isZero X)))\n(assert (not (fp.isInfinite X)))\n(assert (not (fp.isNaN X)))\n(assert (not (fp.isNegative X)))\n(assert (fp.isPositive X))\n\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun X () (_ FloatingPoint 11 53)\n (fp #b0 #b00000000001 #x0000000000000))\n)\n",error:"",status:"z3-ran",hash:"fdb30c9d925f690af715dadf8f6f927e72906259"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,n.kt)("p",null,"Floating point operations are defined modulo rounding modes.\nMany algebraic properties of bit-vectors, integers and reals don't carry over to floating points.\nFor example, addition is not associative."),(0,n.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a Float32)\n(declare-const b Float32)\n(declare-const c Float32)\n\n(assert (not (= (fp.add roundNearestTiesToEven a (fp.add roundNearestTiesToEven b c))\n\t (fp.add roundNearestTiesToEven (fp.add roundNearestTiesToEven a b) c))))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun a () Float32\n (fp #b1 #x12 #b00111110111010001011000))\n (define-fun c () Float32\n (fp #b0 #x16 #b11111000000000010111010))\n (define-fun b () Float32\n (fp #b1 #x16 #b11101100000100010111010))\n)\n",error:"",status:"z3-ran",hash:"295b57781a52173a0540639e303c74eadc3f8f06"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6053633b.49ea8f1f.js b/assets/js/6053633b.49ea8f1f.js new file mode 100644 index 000000000..9f66a8c52 --- /dev/null +++ b/assets/js/6053633b.49ea8f1f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1078],{6906:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var a=n(7462),r=(n(7294),n(3905)),s=n(7634),o=n.n(s);const i={title:"Arrays",sidebar_position:4},l=void 0,c={unversionedId:"theories/Arrays",id:"theories/Arrays",title:"Arrays",description:"SMTLIB2 standard Arrays",source:"@site/docs-smtlib/02 - theories/04 - Arrays.md",sourceDirName:"02 - theories",slug:"/theories/Arrays",permalink:"/z3guide/docs/theories/Arrays",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/04 - Arrays.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Arrays",sidebar_position:4},sidebar:"smtlibSidebar",previous:{title:"IEEE Floats",permalink:"/z3guide/docs/theories/IEEE Floats"},next:{title:"Datatypes",permalink:"/z3guide/docs/theories/Datatypes"}},d={},u=[{value:"Select and Store",id:"select-and-store",level:3},{value:"Constant Arrays",id:"constant-arrays",level:3},{value:"Mapping Functions on Arrays",id:"mapping-functions-on-arrays",level:3},{value:"Bags as Arrays",id:"bags-as-arrays",level:3},{value:"Beyond Arrays",id:"beyond-arrays",level:3},{value:"Array models",id:"array-models",level:3}],p={toc:u};function h(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,r.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-ArraysEx.shtml"},"Arrays"))),(0,r.kt)("p",null,"As part of formulating a programme of a mathematical theory of computation McCarthy proposed a ",(0,r.kt)("em",{parentName:"p"},"basic")," theory of arrays as characterized by the select-store axioms. The expression (select a i) returns the value stored at position i of the array a; and (store a i v) returns a new array identical to a, but on position i it contains the value v."),(0,r.kt)("p",null,"Z3 contains a decision procedure for the basic theory of arrays. By default, Z3 assumes that arrays are extensional over select. In other words, Z3 also enforces that if two arrays agree on all reads, then the arrays are equal."),(0,r.kt)("p",null,"It also contains various extensions for operations on arrays that remain decidable and amenable to efficient saturation procedures (here efficient means, with an NP-complete satisfiability complexity). We describe these extensions in the following using a collection of examples. Additional background on these extensions is available in the paper ",(0,r.kt)("a",{parentName:"p",href:"https://www.microsoft.com/en-us/research/publication/generalized-efficient-array-decision-procedures/"},"Generalized and Efficient Array Decision Procedures"),"."),(0,r.kt)("h3",{id:"select-and-store"},"Select and Store"),(0,r.kt)("p",null,"Let us first check a basic property of arrays. Suppose a1 is an array of integers, then the constraint (and (= (select a1 x) x) (= (store a1 x y) a1)) is satisfiable for an array that contains an index x that maps to x, and when x = y (because the first equality forced the range of x to be x). We can check this constraint."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(declare-const a1 (Array Int Int))\n(declare-const a2 (Array Int Int))\n(assert (= (select a1 x) x))\n(assert (= (store a1 x y) a1))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun x () Int\n 3)\n (define-fun a1 () (Array Int Int)\n (store ((as const (Array Int Int)) 2) 3 3))\n (define-fun y () Int\n 3)\n (define-fun a2 () (Array Int Int)\n ((as const (Array Int Int)) 0))\n)\n",error:"",status:"z3-ran",hash:"9fa0d8d4043928b10ce74cf6c4d8893ac8cd75b6"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("p",null,"On the other hand, the constraints become unsatisfiable when asserting (not (= x y))."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(declare-const a1 (Array Int Int))\n(declare-const a2 (Array Int Int))\n(assert (= (select a1 x) x))\n(assert (= (store a1 x y) a1))\n(assert (not (= x y)))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"f55436efc9be7e9c0bb4690ed7460cdcf9ae758d"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"constant-arrays"},"Constant Arrays"),(0,r.kt)("p",null,"The array that maps all indices to some fixed value can be specified in Z3 using the const construct. It takes one value from the range type of the array and creates an array. Z3 cannot infer what kind of array must be returned by the const construct by just inspecting the argument type. Thus, a qualified identifier (as const (Array T1 T2)) must be used. The following example defines a constant array containing only ones."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const all1 (Array Int Int))\n(declare-const a Int)\n(declare-const i Int)\n(assert (= all1 ((as const (Array Int Int)) 1)))\n(assert (= a (select all1 i)))\n(check-sat)\n(get-model)\n(assert (not (= a 1)))\n(check-sat)",result:{output:"sat\n(\n (define-fun a () Int\n 1)\n (define-fun all1 () (Array Int Int)\n ((as const (Array Int Int)) 1))\n (define-fun i () Int\n 0)\n)\nunsat\n",error:"",status:"z3-ran",hash:"85d8c083c60fede803ae5aa2762b4fd27ea64dc0"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"mapping-functions-on-arrays"},"Mapping Functions on Arrays"),(0,r.kt)("p",null,"In the following, we will simulate basic Boolean algebra (set theory) using the array theory extensions in Z3. Z3 provides a parameterized map function on arrays. It allows applying arbitrary functions to the range of arrays. The following example illustrates how to use the map function.\nThe type constructor ",(0,r.kt)("inlineCode",{parentName:"p"},"(Set T)")," is a macro for ",(0,r.kt)("inlineCode",{parentName:"p"},"(Array T Bool)"),"."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a (Set Int))\n(declare-const b (Set Int))\n(declare-const c (Set Int))\n(declare-const x Int)\n(push)\n(assert (not (= ((_ map and) a b) ((_ map not) ((_ map or) ((_ map not) b) ((_ map not) a))))))\n(check-sat)\n(pop)\n(push) \n(assert (and (select ((_ map and) a b) x) (not (select a x))))\n(check-sat)\n(pop)\n(push) \n(assert (and (select ((_ map or) a b) x) (not (select a x))))\n(check-sat)\n(get-model)\n(assert (and (not (select b x))))\n(check-sat)",result:{output:"unsat\nunsat\nsat\n(\n (define-fun x () Int\n 2)\n (define-fun b () (Set Int)\n ((as const (Set Int)) true))\n (define-fun a () (Set Int)\n ((as const (Set Int)) false))\n (define-fun c () (Set Int)\n ((as const (Set Int)) false))\n)\nunsat\n",error:"",status:"z3-ran",hash:"69cb3d7b41eb5e65d2f148e5f9523ae6513146e9"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"bags-as-arrays"},"Bags as Arrays"),(0,r.kt)("p",null,"We can use the parameterized map function to encode finite sets and finite bags. Finite bags can be modeled similarly to sets. A bag is here an array that maps elements to their multiplicity. Main bag operations include union, obtained by adding multiplicity, intersection, by taking the minimum multiplicity, and a dual join operation that takes the maximum multiplicity. In the following example, we define the bag-union using map. Notice that we need to specify the full signature of + since it is an overloaded operator."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-sort A () (Array Int Int Int))\n(define-fun bag-union ((x A) (y A)) A\n ((_ map (+ (Int Int) Int)) x y))\n(declare-const s1 A)\n(declare-const s2 A)\n(declare-const s3 A)\n(assert (= s3 (bag-union s1 s2)))\n(assert (= (select s1 0 0) 5))\n(assert (= (select s2 0 0) 3))\n(assert (= (select s2 1 2) 4))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun s1 () (Array Int Int Int)\n ((as const (Array Int Int Int)) 5))\n (define-fun s2 () (Array Int Int Int)\n (store ((as const (Array Int Int Int)) 3) 1 2 4))\n (define-fun s3 () (Array Int Int Int)\n (store ((as const (Array Int Int Int)) 8) 1 2 9))\n)\n",error:"",status:"z3-ran",hash:"9ea6d29cf5dd2e2c4b82a94c4f0fa168391f5577"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"beyond-arrays"},"Beyond Arrays"),(0,r.kt)("p",null,"Z3 arrays are identified with function spaces. This choice means that z3's arrays are not literally corresponding to\na first-order models of ",(0,r.kt)("inlineCode",{parentName:"p"},"select/store")," axioms.\nThere is a construct "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"(_ as-array f)\n")),(0,r.kt)("p",null,"that for a function ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," creates a corresponding constant with array sort.\nFor example, if ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," has declaration:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"(declare-fun f (Int Bool) Real)\n")),(0,r.kt)("p",null,"Then ",(0,r.kt)("inlineCode",{parentName:"p"},"(as-array f)")," has the sort ",(0,r.kt)("inlineCode",{parentName:"p"},"(Array Int Bool Real)"),", an array that takes an Integer, a Boolean and maps to a Real.\nAdmitting the ",(0,r.kt)("inlineCode",{parentName:"p"},"as-array")," function (and later on admitting ",(0,r.kt)("inlineCode",{parentName:"p"},"Lambda"),") means that the universe of interpretations for the Array\nsort includes all definable function spaces. If the theory of arrays only has functions ",(0,r.kt)("inlineCode",{parentName:"p"},"select, store, const")," the universe of interpretations for Array is wider (more formulas are satisfiable)."),(0,r.kt)("h3",{id:"array-models"},"Array models"),(0,r.kt)("p",null,"Models provide interpretations of the uninterpreted (aka free) constants and functions that appear in the satisfiable formula. An interpretation for arrays is very similar to the interpretation of a function. Z3 sometimes uses the construct (",(0,r.kt)("em",{parentName:"p"}," as-array f) to give the interpretation for arrays. If the array a is equal to (")," as-array f), then for every index i, (select a i) is equal to (f i)."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6053633b.7d3132d4.js b/assets/js/6053633b.7d3132d4.js deleted file mode 100644 index 227a2b2d1..000000000 --- a/assets/js/6053633b.7d3132d4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1078],{6906:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var a=n(7462),r=(n(7294),n(3905)),s=n(7634),o=n.n(s);const i={title:"Arrays",sidebar_position:4},l=void 0,c={unversionedId:"theories/Arrays",id:"theories/Arrays",title:"Arrays",description:"SMTLIB2 standard Arrays",source:"@site/docs-smtlib/02 - theories/04 - Arrays.md",sourceDirName:"02 - theories",slug:"/theories/Arrays",permalink:"/z3guide/docs/theories/Arrays",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/04 - Arrays.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Arrays",sidebar_position:4},sidebar:"smtlibSidebar",previous:{title:"IEEE Floats",permalink:"/z3guide/docs/theories/IEEE Floats"},next:{title:"Datatypes",permalink:"/z3guide/docs/theories/Datatypes"}},d={},u=[{value:"Select and Store",id:"select-and-store",level:3},{value:"Constant Arrays",id:"constant-arrays",level:3},{value:"Mapping Functions on Arrays",id:"mapping-functions-on-arrays",level:3},{value:"Bags as Arrays",id:"bags-as-arrays",level:3},{value:"Beyond Arrays",id:"beyond-arrays",level:3},{value:"Array models",id:"array-models",level:3}],p={toc:u};function h(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,r.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-ArraysEx.shtml"},"Arrays"))),(0,r.kt)("p",null,"As part of formulating a programme of a mathematical theory of computation McCarthy proposed a ",(0,r.kt)("em",{parentName:"p"},"basic")," theory of arrays as characterized by the select-store axioms. The expression (select a i) returns the value stored at position i of the array a; and (store a i v) returns a new array identical to a, but on position i it contains the value v."),(0,r.kt)("p",null,"Z3 contains a decision procedure for the basic theory of arrays. By default, Z3 assumes that arrays are extensional over select. In other words, Z3 also enforces that if two arrays agree on all reads, then the arrays are equal."),(0,r.kt)("p",null,"It also contains various extensions for operations on arrays that remain decidable and amenable to efficient saturation procedures (here efficient means, with an NP-complete satisfiability complexity). We describe these extensions in the following using a collection of examples. Additional background on these extensions is available in the paper ",(0,r.kt)("a",{parentName:"p",href:"https://www.microsoft.com/en-us/research/publication/generalized-efficient-array-decision-procedures/"},"Generalized and Efficient Array Decision Procedures"),"."),(0,r.kt)("h3",{id:"select-and-store"},"Select and Store"),(0,r.kt)("p",null,"Let us first check a basic property of arrays. Suppose a1 is an array of integers, then the constraint (and (= (select a1 x) x) (= (store a1 x y) a1)) is satisfiable for an array that contains an index x that maps to x, and when x = y (because the first equality forced the range of x to be x). We can check this constraint."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(declare-const a1 (Array Int Int))\n(declare-const a2 (Array Int Int))\n(assert (= (select a1 x) x))\n(assert (= (store a1 x y) a1))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun x () Int\n 3)\n (define-fun a1 () (Array Int Int)\n (store ((as const (Array Int Int)) 2) 3 3))\n (define-fun y () Int\n 3)\n (define-fun a2 () (Array Int Int)\n ((as const (Array Int Int)) 0))\n)\n",error:"",status:"z3-ran",hash:"9fa0d8d4043928b10ce74cf6c4d8893ac8cd75b6"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("p",null,"On the other hand, the constraints become unsatisfiable when asserting (not (= x y))."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(declare-const a1 (Array Int Int))\n(declare-const a2 (Array Int Int))\n(assert (= (select a1 x) x))\n(assert (= (store a1 x y) a1))\n(assert (not (= x y)))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"f55436efc9be7e9c0bb4690ed7460cdcf9ae758d"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"constant-arrays"},"Constant Arrays"),(0,r.kt)("p",null,"The array that maps all indices to some fixed value can be specified in Z3 using the const construct. It takes one value from the range type of the array and creates an array. Z3 cannot infer what kind of array must be returned by the const construct by just inspecting the argument type. Thus, a qualified identifier (as const (Array T1 T2)) must be used. The following example defines a constant array containing only ones."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const all1 (Array Int Int))\n(declare-const a Int)\n(declare-const i Int)\n(assert (= all1 ((as const (Array Int Int)) 1)))\n(assert (= a (select all1 i)))\n(check-sat)\n(get-model)\n(assert (not (= a 1)))\n(check-sat)",result:{output:"sat\n(\n (define-fun a () Int\n 1)\n (define-fun all1 () (Array Int Int)\n ((as const (Array Int Int)) 1))\n (define-fun i () Int\n 0)\n)\nunsat\n",error:"",status:"z3-ran",hash:"85d8c083c60fede803ae5aa2762b4fd27ea64dc0"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"mapping-functions-on-arrays"},"Mapping Functions on Arrays"),(0,r.kt)("p",null,"In the following, we will simulate basic Boolean algebra (set theory) using the array theory extensions in Z3. Z3 provides a parameterized map function on arrays. It allows applying arbitrary functions to the range of arrays. The following example illustrates how to use the map function.\nThe type constructor ",(0,r.kt)("inlineCode",{parentName:"p"},"(Set T)")," is a macro for ",(0,r.kt)("inlineCode",{parentName:"p"},"(Array T Bool)"),"."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a (Set Int))\n(declare-const b (Set Int))\n(declare-const c (Set Int))\n(declare-const x Int)\n(push)\n(assert (not (= ((_ map and) a b) ((_ map not) ((_ map or) ((_ map not) b) ((_ map not) a))))))\n(check-sat)\n(pop)\n(push) \n(assert (and (select ((_ map and) a b) x) (not (select a x))))\n(check-sat)\n(pop)\n(push) \n(assert (and (select ((_ map or) a b) x) (not (select a x))))\n(check-sat)\n(get-model)\n(assert (and (not (select b x))))\n(check-sat)",result:{output:"unsat\nunsat\nsat\n(\n (define-fun x () Int\n 2)\n (define-fun b () (Set Int)\n ((as const (Set Int)) true))\n (define-fun a () (Set Int)\n ((as const (Set Int)) false))\n (define-fun c () (Set Int)\n ((as const (Set Int)) false))\n)\nunsat\n",error:"",status:"z3-ran",hash:"69cb3d7b41eb5e65d2f148e5f9523ae6513146e9"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"bags-as-arrays"},"Bags as Arrays"),(0,r.kt)("p",null,"We can use the parameterized map function to encode finite sets and finite bags. Finite bags can be modeled similarly to sets. A bag is here an array that maps elements to their multiplicity. Main bag operations include union, obtained by adding multiplicity, intersection, by taking the minimum multiplicity, and a dual join operation that takes the maximum multiplicity. In the following example, we define the bag-union using map. Notice that we need to specify the full signature of + since it is an overloaded operator."),(0,r.kt)(o(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-sort A () (Array Int Int Int))\n(define-fun bag-union ((x A) (y A)) A\n ((_ map (+ (Int Int) Int)) x y))\n(declare-const s1 A)\n(declare-const s2 A)\n(declare-const s3 A)\n(assert (= s3 (bag-union s1 s2)))\n(assert (= (select s1 0 0) 5))\n(assert (= (select s2 0 0) 3))\n(assert (= (select s2 1 2) 4))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun s1 () (Array Int Int Int)\n ((as const (Array Int Int Int)) 5))\n (define-fun s2 () (Array Int Int Int)\n (store ((as const (Array Int Int Int)) 3) 1 2 4))\n (define-fun s3 () (Array Int Int Int)\n (store ((as const (Array Int Int Int)) 8) 1 2 9))\n)\n",error:"",status:"z3-ran",hash:"9ea6d29cf5dd2e2c4b82a94c4f0fa168391f5577"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,r.kt)("h3",{id:"beyond-arrays"},"Beyond Arrays"),(0,r.kt)("p",null,"Z3 arrays are identified with function spaces. This choice means that z3's arrays are not literally corresponding to\na first-order models of ",(0,r.kt)("inlineCode",{parentName:"p"},"select/store")," axioms.\nThere is a construct "),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"(_ as-array f)\n")),(0,r.kt)("p",null,"that for a function ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," creates a corresponding constant with array sort.\nFor example, if ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," has declaration:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"(declare-fun f (Int Bool) Real)\n")),(0,r.kt)("p",null,"Then ",(0,r.kt)("inlineCode",{parentName:"p"},"(as-array f)")," has the sort ",(0,r.kt)("inlineCode",{parentName:"p"},"(Array Int Bool Real)"),", an array that takes an Integer, a Boolean and maps to a Real.\nAdmitting the ",(0,r.kt)("inlineCode",{parentName:"p"},"as-array")," function (and later on admitting ",(0,r.kt)("inlineCode",{parentName:"p"},"Lambda"),") means that the universe of interpretations for the Array\nsort includes all definable function spaces. If the theory of arrays only has functions ",(0,r.kt)("inlineCode",{parentName:"p"},"select, store, const")," the universe of interpretations for Array is wider (more formulas are satisfiable)."),(0,r.kt)("h3",{id:"array-models"},"Array models"),(0,r.kt)("p",null,"Models provide interpretations of the uninterpreted (aka free) constants and functions that appear in the satisfiable formula. An interpretation for arrays is very similar to the interpretation of a function. Z3 sometimes uses the construct (",(0,r.kt)("em",{parentName:"p"}," as-array f) to give the interpretation for arrays. If the array a is equal to (")," as-array f), then for every index i, (select a i) is equal to (f i)."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/825bcbd7.4b719028.js b/assets/js/825bcbd7.4b719028.js new file mode 100644 index 000000000..a65d88b21 --- /dev/null +++ b/assets/js/825bcbd7.4b719028.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[344],{8911:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=n(7462),s=(n(7294),n(3905)),a=n(7634),i=n.n(a);const o={title:"Strings",sidebar_position:6},l=void 0,d={unversionedId:"theories/Strings",id:"theories/Strings",title:"Strings",description:"SMTLIB2 standard The theory of unicode strings",source:"@site/docs-smtlib/02 - theories/06 - Strings.md",sourceDirName:"02 - theories",slug:"/theories/Strings",permalink:"/z3guide/docs/theories/Strings",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/06 - Strings.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Strings",sidebar_position:6},sidebar:"smtlibSidebar",previous:{title:"Datatypes",permalink:"/z3guide/docs/theories/Datatypes"},next:{title:"Sequences",permalink:"/z3guide/docs/theories/Sequences"}},u={},c=[{value:"Introduction",id:"introduction",level:2},{value:"String Constraints by Example",id:"string-constraints-by-example",level:2},{value:"Creating Strings",id:"creating-strings",level:2},{value:"Built-in types and constants",id:"built-in-types-and-constants",level:3},{value:"String literals",id:"string-literals",level:3},{value:"String Operations by example",id:"string-operations-by-example",level:2},{value:"(str.++ a b c) - String concatenation",id:"str-a-b-c---string-concatenation",level:3},{value:"(str.len s) - the length of string s",id:"strlen-s---the-length-of-string-s",level:3},{value:"(str.at s offset) - character substring at offset",id:"strat-s-offset---character-substring-at-offset",level:3},{value:"(str.indexof s sub [offset]) - first position of substring",id:"strindexof-s-sub-offset---first-position-of-substring",level:3},{value:"(str.substr s offset length) - substring at a given offset",id:"strsubstr-s-offset-length---substring-at-a-given-offset",level:3},{value:"(str.contains a b) - string containment",id:"strcontains-a-b---string-containment",level:3},{value:"(str.prefixof a b) (str.suffixof a b) - prefix and suffix checks",id:"strprefixof-a-b-strsuffixof-a-b---prefix-and-suffix-checks",level:3},{value:"(str.from_int i) (str.to_int s) - convert to and from non-negative integers",id:"strfrom_int-i-strto_int-s---convert-to-and-from-non-negative-integers",level:3},{value:"(str.< s t) (str.<= s t) - lexicographic string comparison",id:"str-s-t-str-s-t---lexicographic-string-comparison",level:3},{value:"(str.is_digit s) - test if string represents a digit",id:"stris_digit-s---test-if-string-represents-a-digit",level:3},{value:"(str.to_code s) (str.from_code i) - character codes",id:"strto_code-s-strfrom_code-i---character-codes",level:3},{value:"(_ char n) - string from a character code",id:"_-char-n---string-from-a-character-code",level:3},{value:"Summary of Operations",id:"summary-of-operations",level:2}],p={toc:c};function m(e){let{components:t,...n}=e;return(0,s.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("blockquote",null,(0,s.kt)("p",{parentName:"blockquote"},(0,s.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,s.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-UnicodeStrings.shtml"},"The theory of unicode strings"))),(0,s.kt)("h2",{id:"introduction"},"Introduction"),(0,s.kt)("p",null,"This section describes Z3's handling of strings.\nStrings are represented as a sequence of Characters where the default character sort is Unicode.\nYou can reason about regular expressions of sequences.\nSequences over elements other than Unicode characters and regular expressions are described in separate sections.\nZ3 offers built-in support for\nusing string constants and dedicated solvers for checking\nsatisfiability over constraints using strings and sequences.\nNote that the (current) specialized solver is able to establish\nsatisfiability for a non-trivial class of formulas, but is far from\na decision procedure even for fragments of string equalities that can be decided:\nZ3 only solves string equalities using an incomplete\nheuristic solver\nand the full combination of lengths and sequences\n(and regular expressions) is not decidable anyway.\nIn Z3, strings are a special case of sequences, and for the case of Unicode strings,\nand regular expressions over Unicode strings seeks to implement the ",(0,s.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-UnicodeStrings.shtml"},"SMTLIB2 standard"),"."),(0,s.kt)("p",null,"You can configure z3 to use one of two backends for solving strings.\nThe default backend is called the ",(0,s.kt)("inlineCode",{parentName:"p"},"seq")," solver. It solves constraints over both sequences and strings.\nThe other backend is ",(0,s.kt)("a",{parentName:"p",href:"https://z3string.github.io/"},"z3str3"),", which applies to strings and regular expressions over strings.\nExtensions to sequences operations are not supported in z3str3."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(set-option :smt.string_solver z3str3) ; set the string solver to be the z3str3 solver\n(set-option :smt.string_solver seq) ; set the string solver to be the seq solver (default)",result:{output:"",error:"",status:"z3-ran",hash:"fe63ee9c5aec36cb47199f95a886def87f3bf317"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"string-constraints-by-example"},"String Constraints by Example"),(0,s.kt)("p",null,"Strings ",(0,s.kt)("inlineCode",{parentName:"p"},"a, b, c")," can have a non-trivial overlap."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (= (str.++ a b) "abcd"))\n(assert (= (str.++ b c) "cdef"))\n(assert (not (= b "")))\n(check-sat)',result:{output:"sat\n",error:"",status:"z3-ran",hash:"25591d586456acffca62f179a9daab66b6607887"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"There is a solution to ",(0,s.kt)("inlineCode",{parentName:"p"},"a"),' that is not a sequence of "a"\'s.'),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (= (str.++ a "ab" b) (str.++ b "ba" c)))\n(assert (= c (str.++ a b)))\n(assert (not (= (str.++ a "a") (str.++ "a" a))))\n(check-sat)\n(get-model)',result:{output:'sat\n(\n (define-fun b () String\n "")\n (define-fun a () String\n "b")\n (define-fun c () String\n "b")\n)\n',error:"",status:"z3-ran",hash:"b9545f8bc7d3935c682d4a5d310fbd322e28ee0b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"creating-strings"},"Creating Strings"),(0,s.kt)("h3",{id:"built-in-types-and-constants"},"Built-in types and constants"),(0,s.kt)("p",null,"The name ",(0,s.kt)("inlineCode",{parentName:"p"},"String")," is a built-in name for the String sort.\nString literals can furthermore be entered directly as literals\ndelimited by quotes. The following example asks whether there are\nstrings ",(0,s.kt)("inlineCode",{parentName:"p"},"a")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"b")," that concatenate to ",(0,s.kt)("inlineCode",{parentName:"p"},'"abc"'),"\nfollowed by ",(0,s.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(assert (= (str.++ b a) (str.++ "abc" b)))\n(check-sat)\n(get-model)',result:{output:'sat\n(\n (define-fun b () String\n "")\n (define-fun a () String\n "abc")\n)\n',error:"",status:"z3-ran",hash:"e20fe7695a811f9fbed11f1e3cbaa43fe353e8f0"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"string-literals"},"String literals"),(0,s.kt)("p",null,"To represent non-ASCII characters the SMTLIB2 standard uses unicode escape sequences.\nThe escape sequences are of the form ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2082d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2083d\u2082d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2084d\u2083d\u2082d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\ud\u2083d\u2082d\u2081d\u2080"),"\nwhere ",(0,s.kt)("inlineCode",{parentName:"p"},"d")," is a hexadecimal digit. Other\ncharacters are treated as part of the string. For example, a newline within a string\nis treated as a new-line character. "),(0,s.kt)("p",null,"The following example shows\nthree ways to enter the newline character."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(define-const a String "\\u{a}")\n(define-const b String "\n")\n(define-const c String "\\n") ; this is not a newline character but \\ followed by n\n(simplify (= a b))\n(simplify (= a c))\n(simplify (str.++ a b c))',result:{output:'true\nfalse\n"\\u{a}\\u{a}\\n"\n',error:"",status:"z3-ran",hash:"dbd5a4599e97292439bd61a0cd6bb13307bc4cea"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"string-operations-by-example"},"String Operations by example"),(0,s.kt)("h3",{id:"str-a-b-c---string-concatenation"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.++ a b c)")," - String concatenation"),(0,s.kt)("p",null,"A string cannot overlap with two different characters."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(assert (= (str.++ a "b") (str.++ "a" a)))\n(check-sat)',result:{output:"unsat\n",error:"",status:"z3-ran",hash:"9a0f606b7498b11a32272db29ebf1e74f37e320e"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strlen-s---the-length-of-string-s"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.len s)")," - the length of string ",(0,s.kt)("inlineCode",{parentName:"h3"},"s")),(0,s.kt)("p",null,"There is a solution to ",(0,s.kt)("inlineCode",{parentName:"p"},"a")," of length at most 2."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(assert (= (str.++ "abc" a) (str.++ b "cef")))\n(assert (<= (str.len a) 2))\n(check-sat)',result:{output:"sat\n",error:"",status:"z3-ran",hash:"beb1892f8f5fc90e4d97608febd2bcd8584c7172"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strat-s-offset---character-substring-at-offset"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.at s offset)")," - character substring at offset"),(0,s.kt)("p",null,"The substring is of length 1 if ",(0,s.kt)("inlineCode",{parentName:"p"},"offset")," is within the bounds of ",(0,s.kt)("inlineCode",{parentName:"p"},"s"),", otherwise the result is the empty string."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.++ (str.at "abc" 1) (str.at "abc" 0)))\n(simplify (str.at "abcd" 4))',result:{output:'"ba"\n""\n',error:"",status:"z3-ran",hash:"ace32b494cded13845c46388ccabaab5124c185a"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Note that ",(0,s.kt)("inlineCode",{parentName:"p"},"str.at")," does not result in a character but a string of length one.\nYou can use ",(0,s.kt)("inlineCode",{parentName:"p"},'(seq.nth "abc" 1)')," to access the character at offset 1.\nThe function ",(0,s.kt)("inlineCode",{parentName:"p"},"seq.nth")," is not part of the SMTLIB2 format for strings. "),(0,s.kt)("h3",{id:"strindexof-s-sub-offset---first-position-of-substring"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.indexof s sub [offset])")," - first position of substring"),(0,s.kt)("p",null,"The result is the first position of ",(0,s.kt)("inlineCode",{parentName:"p"},"sub")," in ",(0,s.kt)("inlineCode",{parentName:"p"},"s"),", -1 if there are no occurrence.\nThe offset argument is optional. No offset corresponds to the offset 0."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.indexof "abcabc" "a"))\n(simplify (str.indexof "abcabc" "a" 1))\n(simplify (str.indexof "abcabc" "a" 4))',result:{output:"0\n3\n(- 1)\n",error:"",status:"z3-ran",hash:"a38a9d5faf7b22016770043a08d1a442518e8d3d"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strsubstr-s-offset-length---substring-at-a-given-offset"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.substr s offset length)")," - substring at a given offset"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.substr "xxabcyy" 2 3))\n(simplify (str.substr "xxabcyy" 2 10)) ; there are only 5 characters left to return\n(simplify (str.substr "xxabcyy" 10 2)) ; offset is out of bounds, so return the empty string',result:{output:'"abc"\n"abcyy"\n""\n',error:"",status:"z3-ran",hash:"25a5d48a2e00041321b0862cb0af265f9e51b766"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strcontains-a-b---string-containment"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.contains a b)")," - string containment"),(0,s.kt)("p",null,"Contains is transitive."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (str.contains a b))\n(assert (str.contains b c))\n(assert (not (str.contains a c)))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"d2cb4691fe9832f56f87866b81545ccb03343f2f"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"But containment is not a linear order."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (str.contains a b))\n(assert (str.contains a c))\n(assert (not (str.contains b c)))\n(assert (not (str.contains c b)))\n(check-sat)\n(get-model)",result:{output:'sat\n(\n (define-fun b () String\n "B")\n (define-fun a () String\n "BA")\n (define-fun c () String\n "A")\n)\n',error:"",status:"z3-ran",hash:"b63d9d60cf8303832bf8d96fb94adec7653cfdcb"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strprefixof-a-b-strsuffixof-a-b---prefix-and-suffix-checks"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.prefixof a b)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.suffixof a b)")," - prefix and suffix checks"),(0,s.kt)("p",null,"Every string is equal to the prefix and suffix that add up to a its length."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (str.prefixof b a))\n(assert (str.suffixof c a))\n(assert (= (str.len a) (+ (str.len b) (str.len c))))\n(assert (not (= a (str.++ b c))))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"c9541402437c202f2aa60ae24f085e2724fda87a"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strfrom_int-i-strto_int-s---convert-to-and-from-non-negative-integers"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.from_int i)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.to_int s)")," - convert to and from non-negative integers"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.from_int 10))\n(simplify (str.from_int -1)) ; results in the empty string because -1 is not non-negative\n(simplify (str.to_int "10"))\n(simplify (str.to_int "010")) ; leading 0s are ignored\n(simplify (str.to_int "000"))\n(simplify (str.to_int "-10")) ; results in -1 because -10 is not non-negative',result:{output:'"10"\n""\n10\n10\n0\n(- 1)\n',error:"",status:"z3-ran",hash:"af8c4af65bdb24662d13c6e6ca358df526e24d41"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"str-s-t-str-s-t---lexicographic-string-comparison"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.< s t)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.<= s t)")," - lexicographic string comparison"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.< "alex" "andra"))\n(simplify (str.<= "nate" "anthony"))',result:{output:"true\nfalse\n",error:"",status:"z3-ran",hash:"88bc2918cbad771ef83a0b4d5be03ce4e706b006"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"stris_digit-s---test-if-string-represents-a-digit"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.is_digit s)")," - test if string represents a digit"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.is_digit "1")) ; true\n(simplify (str.is_digit "10")) ; false - it is not a single character\n(simplify (str.is_digit "a")) ; false - there aren\'t even any digits',result:{output:"true\nfalse\nfalse\n",error:"",status:"z3-ran",hash:"f65356fad7e5204ecd1bdf2c633ece683dcda01c"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strto_code-s-strfrom_code-i---character-codes"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.to_code s)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.from_code i)")," - character codes"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.to_code "a"))\n(simplify (str.from_code 1214))',result:{output:'97\n"\\u{4be}"\n',error:"",status:"z3-ran",hash:"4b0560b0437075b054ccf14a3dea5be29b760510"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"_-char-n---string-from-a-character-code"},(0,s.kt)("inlineCode",{parentName:"h3"},"(_ char n)")," - string from a character code"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (_ char 1000))\n(simplify (_ char 100000000)) ; out of bounds",result:{output:'"\\u{3e8}"\n(error "line 2 column 28: character literal is out of bounds")\n',error:'"\\u{3e8}"\n(error "line 2 column 28: character literal is out of bounds")\n',status:"z3-runtime-error",hash:"f8ff6a2454edfef39eb01bec5c1422c10ca3f728"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Note that after ",(0,s.kt)("inlineCode",{parentName:"p"},"(_ char 54)")," is the same as ",(0,s.kt)("inlineCode",{parentName:"p"},"(simplify (str.from_code 54))"),"."),(0,s.kt)("h2",{id:"summary-of-operations"},"Summary of Operations"),(0,s.kt)("table",null,(0,s.kt)("thead",{parentName:"table"},(0,s.kt)("tr",{parentName:"thead"},(0,s.kt)("th",{parentName:"tr",align:null},"Operation"),(0,s.kt)("th",{parentName:"tr",align:null},"Brief description"))),(0,s.kt)("tbody",{parentName:"table"},(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.++ a b c)")),(0,s.kt)("td",{parentName:"tr",align:null},"String concatenation of one or more strings")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.len s)")),(0,s.kt)("td",{parentName:"tr",align:null},"String length. Returns an integer")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.substr s offset length)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieves substring of ",(0,s.kt)("inlineCode",{parentName:"td"},"s")," at ",(0,s.kt)("inlineCode",{parentName:"td"},"offset"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.indexof s sub)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieves first position of ",(0,s.kt)("inlineCode",{parentName:"td"},"sub")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),", -1 if there are no occurrences")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.indexof s sub offset)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieves first position of ",(0,s.kt)("inlineCode",{parentName:"td"},"sub")," at or after ",(0,s.kt)("inlineCode",{parentName:"td"},"offset")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),", -1 if there are no occurrences")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.at s offset)")),(0,s.kt)("td",{parentName:"tr",align:null},"Substring of length 1 at ",(0,s.kt)("inlineCode",{parentName:"td"},"offset")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.contains s sub)")),(0,s.kt)("td",{parentName:"tr",align:null},"Does ",(0,s.kt)("inlineCode",{parentName:"td"},"s")," contain the substring ",(0,s.kt)("inlineCode",{parentName:"td"},"sub"),"?")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.prefixof pre s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Is ",(0,s.kt)("inlineCode",{parentName:"td"},"pre")," a prefix of ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),"?")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.suffixof suf s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Is ",(0,s.kt)("inlineCode",{parentName:"td"},"suf")," a suffix of ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),"?")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.replace s src dst)")),(0,s.kt)("td",{parentName:"tr",align:null},"Replace the first occurrence of ",(0,s.kt)("inlineCode",{parentName:"td"},"src")," by ",(0,s.kt)("inlineCode",{parentName:"td"},"dst")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.to_int s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieve integer encoded by string ",(0,s.kt)("inlineCode",{parentName:"td"},"s"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.from_int i)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieve string encoding of integer ",(0,s.kt)("inlineCode",{parentName:"td"},"i"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.< s1 s2)")),(0,s.kt)("td",{parentName:"tr",align:null},"Lexicographic string less than")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.<= s1 s2)")),(0,s.kt)("td",{parentName:"tr",align:null},"Lexicographic string less or equal to")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(_ char ch)")),(0,s.kt)("td",{parentName:"tr",align:null},"Unit string from unicode character code")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.is_digit s)")),(0,s.kt)("td",{parentName:"tr",align:null},"A predicate whether string is a one of the digits 0 to 9")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.to_code s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Convert string of length one to the character code (an integer). Produce -1 if the string is not of length 1")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.from_code i)")),(0,s.kt)("td",{parentName:"tr",align:null},"Convert an integer in the range of valid Unicode to a string of length one")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.replace_all s src dst)")),(0,s.kt)("td",{parentName:"tr",align:null},"Currently not supported: replace all occurrences of ",(0,s.kt)("inlineCode",{parentName:"td"},"s")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"src")," by ",(0,s.kt)("inlineCode",{parentName:"td"},"dst"))))),(0,s.kt)("p",null,"Note that ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.indexof s offset)")," is shorthand for ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.indexof s offset 0)"),".\nAlso, note that ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.at s i)")," is the empty string or sequence for indices that are either negative or beyond\n",(0,s.kt)("inlineCode",{parentName:"p"},"(- (str.len s) 1)"),". Furthermore ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.substr s offset length)")," is empty\nwhen the offset is outside the range of positions in ",(0,s.kt)("inlineCode",{parentName:"p"},"s")," or ",(0,s.kt)("inlineCode",{parentName:"p"},"length")," is negative or\n",(0,s.kt)("inlineCode",{parentName:"p"},"offset+length")," exceeds the length of ",(0,s.kt)("inlineCode",{parentName:"p"},"s"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/825bcbd7.c5939aa5.js b/assets/js/825bcbd7.c5939aa5.js deleted file mode 100644 index 997b5a7f8..000000000 --- a/assets/js/825bcbd7.c5939aa5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[344],{8911:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=n(7462),s=(n(7294),n(3905)),a=n(7634),i=n.n(a);const o={title:"Strings",sidebar_position:6},l=void 0,d={unversionedId:"theories/Strings",id:"theories/Strings",title:"Strings",description:"SMTLIB2 standard The theory of unicode strings",source:"@site/docs-smtlib/02 - theories/06 - Strings.md",sourceDirName:"02 - theories",slug:"/theories/Strings",permalink:"/z3guide/docs/theories/Strings",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/06 - Strings.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Strings",sidebar_position:6},sidebar:"smtlibSidebar",previous:{title:"Datatypes",permalink:"/z3guide/docs/theories/Datatypes"},next:{title:"Sequences",permalink:"/z3guide/docs/theories/Sequences"}},u={},c=[{value:"Introduction",id:"introduction",level:2},{value:"String Constraints by Example",id:"string-constraints-by-example",level:2},{value:"Creating Strings",id:"creating-strings",level:2},{value:"Built-in types and constants",id:"built-in-types-and-constants",level:3},{value:"String literals",id:"string-literals",level:3},{value:"String Operations by example",id:"string-operations-by-example",level:2},{value:"(str.++ a b c) - String concatenation",id:"str-a-b-c---string-concatenation",level:3},{value:"(str.len s) - the length of string s",id:"strlen-s---the-length-of-string-s",level:3},{value:"(str.at s offset) - character substring at offset",id:"strat-s-offset---character-substring-at-offset",level:3},{value:"(str.indexof s sub [offset]) - first position of substring",id:"strindexof-s-sub-offset---first-position-of-substring",level:3},{value:"(str.substr s offset length) - substring at a given offset",id:"strsubstr-s-offset-length---substring-at-a-given-offset",level:3},{value:"(str.contains a b) - string containment",id:"strcontains-a-b---string-containment",level:3},{value:"(str.prefixof a b) (str.suffixof a b) - prefix and suffix checks",id:"strprefixof-a-b-strsuffixof-a-b---prefix-and-suffix-checks",level:3},{value:"(str.from_int i) (str.to_int s) - convert to and from non-negative integers",id:"strfrom_int-i-strto_int-s---convert-to-and-from-non-negative-integers",level:3},{value:"(str.< s t) (str.<= s t) - lexicographic string comparison",id:"str-s-t-str-s-t---lexicographic-string-comparison",level:3},{value:"(str.is_digit s) - test if string represents a digit",id:"stris_digit-s---test-if-string-represents-a-digit",level:3},{value:"(str.to_code s) (str.from_code i) - character codes",id:"strto_code-s-strfrom_code-i---character-codes",level:3},{value:"(_ char n) - string from a character code",id:"_-char-n---string-from-a-character-code",level:3},{value:"Summary of Operations",id:"summary-of-operations",level:2}],p={toc:c};function m(e){let{components:t,...n}=e;return(0,s.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("blockquote",null,(0,s.kt)("p",{parentName:"blockquote"},(0,s.kt)("strong",{parentName:"p"},"SMTLIB2 standard")," ",(0,s.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-UnicodeStrings.shtml"},"The theory of unicode strings"))),(0,s.kt)("h2",{id:"introduction"},"Introduction"),(0,s.kt)("p",null,"This section describes Z3's handling of strings.\nStrings are represented as a sequence of Characters where the default character sort is Unicode.\nYou can reason about regular expressions of sequences.\nSequences over elements other than Unicode characters and regular expressions are described in separate sections.\nZ3 offers built-in support for\nusing string constants and dedicated solvers for checking\nsatisfiability over constraints using strings and sequences.\nNote that the (current) specialized solver is able to establish\nsatisfiability for a non-trivial class of formulas, but is far from\na decision procedure even for fragments of string equalities that can be decided:\nZ3 only solves string equalities using an incomplete\nheuristic solver\nand the full combination of lengths and sequences\n(and regular expressions) is not decidable anyway.\nIn Z3, strings are a special case of sequences, and for the case of Unicode strings,\nand regular expressions over Unicode strings seeks to implement the ",(0,s.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-UnicodeStrings.shtml"},"SMTLIB2 standard"),"."),(0,s.kt)("p",null,"You can configure z3 to use one of two backends for solving strings.\nThe default backend is called the ",(0,s.kt)("inlineCode",{parentName:"p"},"seq")," solver. It solves constraints over both sequences and strings.\nThe other backend is ",(0,s.kt)("a",{parentName:"p",href:"https://z3string.github.io/"},"z3str3"),", which applies to strings and regular expressions over strings.\nExtensions to sequences operations are not supported in z3str3."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(set-option :smt.string_solver z3str3) ; set the string solver to be the z3str3 solver\n(set-option :smt.string_solver seq) ; set the string solver to be the seq solver (default)",result:{output:"",error:"",status:"z3-ran",hash:"fe63ee9c5aec36cb47199f95a886def87f3bf317"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"string-constraints-by-example"},"String Constraints by Example"),(0,s.kt)("p",null,"Strings ",(0,s.kt)("inlineCode",{parentName:"p"},"a, b, c")," can have a non-trivial overlap."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (= (str.++ a b) "abcd"))\n(assert (= (str.++ b c) "cdef"))\n(assert (not (= b "")))\n(check-sat)',result:{output:"sat\n",error:"",status:"z3-ran",hash:"25591d586456acffca62f179a9daab66b6607887"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"There is a solution to ",(0,s.kt)("inlineCode",{parentName:"p"},"a"),' that is not a sequence of "a"\'s.'),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (= (str.++ a "ab" b) (str.++ b "ba" c)))\n(assert (= c (str.++ a b)))\n(assert (not (= (str.++ a "a") (str.++ "a" a))))\n(check-sat)\n(get-model)',result:{output:'sat\n(\n (define-fun b () String\n "")\n (define-fun a () String\n "b")\n (define-fun c () String\n "b")\n)\n',error:"",status:"z3-ran",hash:"b9545f8bc7d3935c682d4a5d310fbd322e28ee0b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"creating-strings"},"Creating Strings"),(0,s.kt)("h3",{id:"built-in-types-and-constants"},"Built-in types and constants"),(0,s.kt)("p",null,"The name ",(0,s.kt)("inlineCode",{parentName:"p"},"String")," is a built-in name for the String sort.\nString literals can furthermore be entered directly as literals\ndelimited by quotes. The following example asks whether there are\nstrings ",(0,s.kt)("inlineCode",{parentName:"p"},"a")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"b")," that concatenate to ",(0,s.kt)("inlineCode",{parentName:"p"},'"abc"'),"\nfollowed by ",(0,s.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(assert (= (str.++ b a) (str.++ "abc" b)))\n(check-sat)\n(get-model)',result:{output:'sat\n(\n (define-fun b () String\n "")\n (define-fun a () String\n "abc")\n)\n',error:"",status:"z3-ran",hash:"e20fe7695a811f9fbed11f1e3cbaa43fe353e8f0"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"string-literals"},"String literals"),(0,s.kt)("p",null,"To represent non-ASCII characters the SMTLIB2 standard uses unicode escape sequences.\nThe escape sequences are of the form ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2082d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2083d\u2082d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\u{d\u2084d\u2083d\u2082d\u2081d\u2080}"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"\\ud\u2083d\u2082d\u2081d\u2080"),"\nwhere ",(0,s.kt)("inlineCode",{parentName:"p"},"d")," is a hexadecimal digit. Other\ncharacters are treated as part of the string. For example, a newline within a string\nis treated as a new-line character. "),(0,s.kt)("p",null,"The following example shows\nthree ways to enter the newline character."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(define-const a String "\\u{a}")\n(define-const b String "\n")\n(define-const c String "\\n") ; this is not a newline character but \\ followed by n\n(simplify (= a b))\n(simplify (= a c))\n(simplify (str.++ a b c))',result:{output:'true\nfalse\n"\\u{a}\\u{a}\\n"\n',error:"",status:"z3-ran",hash:"dbd5a4599e97292439bd61a0cd6bb13307bc4cea"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h2",{id:"string-operations-by-example"},"String Operations by example"),(0,s.kt)("h3",{id:"str-a-b-c---string-concatenation"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.++ a b c)")," - String concatenation"),(0,s.kt)("p",null,"A string cannot overlap with two different characters."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(assert (= (str.++ a "b") (str.++ "a" a)))\n(check-sat)',result:{output:"unsat\n",error:"",status:"z3-ran",hash:"9a0f606b7498b11a32272db29ebf1e74f37e320e"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strlen-s---the-length-of-string-s"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.len s)")," - the length of string ",(0,s.kt)("inlineCode",{parentName:"h3"},"s")),(0,s.kt)("p",null,"There is a solution to ",(0,s.kt)("inlineCode",{parentName:"p"},"a")," of length at most 2."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(declare-const a String)\n(declare-const b String)\n(assert (= (str.++ "abc" a) (str.++ b "cef")))\n(assert (<= (str.len a) 2))\n(check-sat)',result:{output:"sat\n",error:"",status:"z3-ran",hash:"beb1892f8f5fc90e4d97608febd2bcd8584c7172"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strat-s-offset---character-substring-at-offset"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.at s offset)")," - character substring at offset"),(0,s.kt)("p",null,"The substring is of length 1 if ",(0,s.kt)("inlineCode",{parentName:"p"},"offset")," is within the bounds of ",(0,s.kt)("inlineCode",{parentName:"p"},"s"),", otherwise the result is the empty string."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.++ (str.at "abc" 1) (str.at "abc" 0)))\n(simplify (str.at "abcd" 4))',result:{output:'"ba"\n""\n',error:"",status:"z3-ran",hash:"ace32b494cded13845c46388ccabaab5124c185a"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Note that ",(0,s.kt)("inlineCode",{parentName:"p"},"str.at")," does not result in a character but a string of length one.\nYou can use ",(0,s.kt)("inlineCode",{parentName:"p"},'(seq.nth "abc" 1)')," to access the character at offset 1.\nThe function ",(0,s.kt)("inlineCode",{parentName:"p"},"seq.nth")," is not part of the SMTLIB2 format for strings. "),(0,s.kt)("h3",{id:"strindexof-s-sub-offset---first-position-of-substring"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.indexof s sub [offset])")," - first position of substring"),(0,s.kt)("p",null,"The result is the first position of ",(0,s.kt)("inlineCode",{parentName:"p"},"sub")," in ",(0,s.kt)("inlineCode",{parentName:"p"},"s"),", -1 if there are no occurrence.\nThe offset argument is optional. No offset corresponds to the offset 0."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.indexof "abcabc" "a"))\n(simplify (str.indexof "abcabc" "a" 1))\n(simplify (str.indexof "abcabc" "a" 4))',result:{output:"0\n3\n(- 1)\n",error:"",status:"z3-ran",hash:"a38a9d5faf7b22016770043a08d1a442518e8d3d"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strsubstr-s-offset-length---substring-at-a-given-offset"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.substr s offset length)")," - substring at a given offset"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.substr "xxabcyy" 2 3))\n(simplify (str.substr "xxabcyy" 2 10)) ; there are only 5 characters left to return\n(simplify (str.substr "xxabcyy" 10 2)) ; offset is out of bounds, so return the empty string',result:{output:'"abc"\n"abcyy"\n""\n',error:"",status:"z3-ran",hash:"25a5d48a2e00041321b0862cb0af265f9e51b766"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strcontains-a-b---string-containment"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.contains a b)")," - string containment"),(0,s.kt)("p",null,"Contains is transitive."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (str.contains a b))\n(assert (str.contains b c))\n(assert (not (str.contains a c)))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"d2cb4691fe9832f56f87866b81545ccb03343f2f"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"But containment is not a linear order."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (str.contains a b))\n(assert (str.contains a c))\n(assert (not (str.contains b c)))\n(assert (not (str.contains c b)))\n(check-sat)\n(get-model)",result:{output:'sat\n(\n (define-fun b () String\n "B")\n (define-fun a () String\n "BA")\n (define-fun c () String\n "A")\n)\n',error:"",status:"z3-ran",hash:"b63d9d60cf8303832bf8d96fb94adec7653cfdcb"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strprefixof-a-b-strsuffixof-a-b---prefix-and-suffix-checks"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.prefixof a b)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.suffixof a b)")," - prefix and suffix checks"),(0,s.kt)("p",null,"Every string is equal to the prefix and suffix that add up to a its length."),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a String)\n(declare-const b String)\n(declare-const c String)\n(assert (str.prefixof b a))\n(assert (str.suffixof c a))\n(assert (= (str.len a) (+ (str.len b) (str.len c))))\n(assert (not (= a (str.++ b c))))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"c9541402437c202f2aa60ae24f085e2724fda87a"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strfrom_int-i-strto_int-s---convert-to-and-from-non-negative-integers"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.from_int i)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.to_int s)")," - convert to and from non-negative integers"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.from_int 10))\n(simplify (str.from_int -1)) ; results in the empty string because -1 is not non-negative\n(simplify (str.to_int "10"))\n(simplify (str.to_int "010")) ; leading 0s are ignored\n(simplify (str.to_int "000"))\n(simplify (str.to_int "-10")) ; results in -1 because -10 is not non-negative',result:{output:'"10"\n""\n10\n10\n0\n(- 1)\n',error:"",status:"z3-ran",hash:"af8c4af65bdb24662d13c6e6ca358df526e24d41"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"str-s-t-str-s-t---lexicographic-string-comparison"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.< s t)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.<= s t)")," - lexicographic string comparison"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.< "alex" "andra"))\n(simplify (str.<= "nate" "anthony"))',result:{output:"true\nfalse\n",error:"",status:"z3-ran",hash:"88bc2918cbad771ef83a0b4d5be03ce4e706b006"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"stris_digit-s---test-if-string-represents-a-digit"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.is_digit s)")," - test if string represents a digit"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.is_digit "1")) ; true\n(simplify (str.is_digit "10")) ; false - it is not a single character\n(simplify (str.is_digit "a")) ; false - there aren\'t even any digits',result:{output:"true\nfalse\nfalse\n",error:"",status:"z3-ran",hash:"f65356fad7e5204ecd1bdf2c633ece683dcda01c"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"strto_code-s-strfrom_code-i---character-codes"},(0,s.kt)("inlineCode",{parentName:"h3"},"(str.to_code s)")," ",(0,s.kt)("inlineCode",{parentName:"h3"},"(str.from_code i)")," - character codes"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:'(simplify (str.to_code "a"))\n(simplify (str.from_code 1214))',result:{output:'97\n"\\u{4be}"\n',error:"",status:"z3-ran",hash:"4b0560b0437075b054ccf14a3dea5be29b760510"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("h3",{id:"_-char-n---string-from-a-character-code"},(0,s.kt)("inlineCode",{parentName:"h3"},"(_ char n)")," - string from a character code"),(0,s.kt)(i(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (_ char 1000))\n(simplify (_ char 100000000)) ; out of bounds",result:{output:'"\\u{3e8}"\n(error "line 2 column 28: character literal is out of bounds")\n',error:'"\\u{3e8}"\n(error "line 2 column 28: character literal is out of bounds")\n',status:"z3-runtime-error",hash:"f8ff6a2454edfef39eb01bec5c1422c10ca3f728"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Note that after ",(0,s.kt)("inlineCode",{parentName:"p"},"(_ char 54)")," is the same as ",(0,s.kt)("inlineCode",{parentName:"p"},"(simplify (str.from_code 54))"),"."),(0,s.kt)("h2",{id:"summary-of-operations"},"Summary of Operations"),(0,s.kt)("table",null,(0,s.kt)("thead",{parentName:"table"},(0,s.kt)("tr",{parentName:"thead"},(0,s.kt)("th",{parentName:"tr",align:null},"Operation"),(0,s.kt)("th",{parentName:"tr",align:null},"Brief description"))),(0,s.kt)("tbody",{parentName:"table"},(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.++ a b c)")),(0,s.kt)("td",{parentName:"tr",align:null},"String concatenation of one or more strings")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.len s)")),(0,s.kt)("td",{parentName:"tr",align:null},"String length. Returns an integer")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.substr s offset length)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieves substring of ",(0,s.kt)("inlineCode",{parentName:"td"},"s")," at ",(0,s.kt)("inlineCode",{parentName:"td"},"offset"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.indexof s sub)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieves first position of ",(0,s.kt)("inlineCode",{parentName:"td"},"sub")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),", -1 if there are no occurrences")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.indexof s sub offset)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieves first position of ",(0,s.kt)("inlineCode",{parentName:"td"},"sub")," at or after ",(0,s.kt)("inlineCode",{parentName:"td"},"offset")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),", -1 if there are no occurrences")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.at s offset)")),(0,s.kt)("td",{parentName:"tr",align:null},"Substring of length 1 at ",(0,s.kt)("inlineCode",{parentName:"td"},"offset")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.contains s sub)")),(0,s.kt)("td",{parentName:"tr",align:null},"Does ",(0,s.kt)("inlineCode",{parentName:"td"},"s")," contain the substring ",(0,s.kt)("inlineCode",{parentName:"td"},"sub"),"?")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.prefixof pre s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Is ",(0,s.kt)("inlineCode",{parentName:"td"},"pre")," a prefix of ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),"?")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.suffixof suf s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Is ",(0,s.kt)("inlineCode",{parentName:"td"},"suf")," a suffix of ",(0,s.kt)("inlineCode",{parentName:"td"},"s"),"?")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.replace s src dst)")),(0,s.kt)("td",{parentName:"tr",align:null},"Replace the first occurrence of ",(0,s.kt)("inlineCode",{parentName:"td"},"src")," by ",(0,s.kt)("inlineCode",{parentName:"td"},"dst")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"s"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.to_int s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieve integer encoded by string ",(0,s.kt)("inlineCode",{parentName:"td"},"s"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.from_int i)")),(0,s.kt)("td",{parentName:"tr",align:null},"Retrieve string encoding of integer ",(0,s.kt)("inlineCode",{parentName:"td"},"i"))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.< s1 s2)")),(0,s.kt)("td",{parentName:"tr",align:null},"Lexicographic string less than")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.<= s1 s2)")),(0,s.kt)("td",{parentName:"tr",align:null},"Lexicographic string less or equal to")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(_ char ch)")),(0,s.kt)("td",{parentName:"tr",align:null},"Unit string from unicode character code")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.is_digit s)")),(0,s.kt)("td",{parentName:"tr",align:null},"A predicate whether string is a one of the digits 0 to 9")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.to_code s)")),(0,s.kt)("td",{parentName:"tr",align:null},"Convert string of length one to the character code (an integer). Produce -1 if the string is not of length 1")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.from_code i)")),(0,s.kt)("td",{parentName:"tr",align:null},"Convert an integer in the range of valid Unicode to a string of length one")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:null},(0,s.kt)("inlineCode",{parentName:"td"},"(str.replace_all s src dst)")),(0,s.kt)("td",{parentName:"tr",align:null},"Currently not supported: replace all occurrences of ",(0,s.kt)("inlineCode",{parentName:"td"},"s")," in ",(0,s.kt)("inlineCode",{parentName:"td"},"src")," by ",(0,s.kt)("inlineCode",{parentName:"td"},"dst"))))),(0,s.kt)("p",null,"Note that ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.indexof s offset)")," is shorthand for ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.indexof s offset 0)"),".\nAlso, note that ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.at s i)")," is the empty string or sequence for indices that are either negative or beyond\n",(0,s.kt)("inlineCode",{parentName:"p"},"(- (str.len s) 1)"),". Furthermore ",(0,s.kt)("inlineCode",{parentName:"p"},"(str.substr s offset length)")," is empty\nwhen the offset is outside the range of positions in ",(0,s.kt)("inlineCode",{parentName:"p"},"s")," or ",(0,s.kt)("inlineCode",{parentName:"p"},"length")," is negative or\n",(0,s.kt)("inlineCode",{parentName:"p"},"offset+length")," exceeds the length of ",(0,s.kt)("inlineCode",{parentName:"p"},"s"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/adb42a35.f2d8767d.js b/assets/js/adb42a35.f2d8767d.js deleted file mode 100644 index e39fb5e42..000000000 --- a/assets/js/adb42a35.f2d8767d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4011],{5747:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>m,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>d,toc:()=>u});var n=i(7462),a=(i(7294),i(3905)),o=i(7634),r=i.n(o);const s={title:"Arithmetical Optimization",sidebar_position:3},l=void 0,d={unversionedId:"optimization/arithmeticaloptimization",id:"optimization/arithmeticaloptimization",title:"Arithmetical Optimization",description:"Z3 extends the The SMTLIB format with the following commands for working with optimization objectives:",source:"@site/docs-smtlib/04 - optimization/03 - arithmeticaloptimization.md",sourceDirName:"04 - optimization",slug:"/optimization/arithmeticaloptimization",permalink:"/z3guide/docs/optimization/arithmeticaloptimization",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/04 - optimization/03 - arithmeticaloptimization.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Arithmetical Optimization",sidebar_position:3},sidebar:"smtlibSidebar",previous:{title:"Optimization from the API",permalink:"/z3guide/docs/optimization/apioptimization"},next:{title:"Soft Constraints",permalink:"/z3guide/docs/optimization/softconstraints"}},m={},u=[{value:"Maximize and Minimize",id:"maximize-and-minimize",level:2},{value:"Unbounded Objectives",id:"unbounded-objectives",level:2},{value:"Tight Bounds",id:"tight-bounds",level:2}],c={toc:u};function p(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Z3 extends the The ",(0,a.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/"},"SMTLIB format")," with the following commands for working with optimization objectives:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Command"),(0,a.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(maximize t)")),(0,a.kt)("td",{parentName:"tr",align:null},"The result of ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," should seek to produce a model that ",(0,a.kt)("em",{parentName:"td"},"maximizes")," the value of ",(0,a.kt)("inlineCode",{parentName:"td"},"t"),". The expression can be integer, real or Bit-vector sort.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(minimize t)")),(0,a.kt)("td",{parentName:"tr",align:null},"The result of ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," should seek to produce a model that ",(0,a.kt)("em",{parentName:"td"},"minimizes")," the value of ",(0,a.kt)("inlineCode",{parentName:"td"},"t")," The expression can be integer, real or Bit-vector sort.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(add-soft b [:weight w] [:id id])")),(0,a.kt)("td",{parentName:"tr",align:null},"The result of ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," should seek to satisfy soft constraints. The default weight is 1. Weights are used to give priorities. Soft constraints can be grouped in disjoint groups by tagging them with optional identifiers.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(get-objectives)")),(0,a.kt)("td",{parentName:"tr",align:null},"After ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," retrieve the values of the maximize, minimize and soft constraint objectives.")))),(0,a.kt)("h2",{id:"maximize-and-minimize"},"Maximize and Minimize"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"(maximize t)")," command instructs check-sat to produce a model that maximizes the value of term t. The type of ",(0,a.kt)("inlineCode",{parentName:"p"},"t")," must be either ",(0,a.kt)("inlineCode",{parentName:"p"},"Int"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"Real"),", or ",(0,a.kt)("inlineCode",{parentName:"p"},"BitVec"),"."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 2))\n(assert (< (- y x) 1))\n(maximize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) 2)\n)\n",error:"",status:"z3-ran",hash:"f9dfcc64cc935f2d972db0460ac87f91253205f5"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"(minimize t)")," command instructs check-sat to produce a model that minimizes the value of term ",(0,a.kt)("inlineCode",{parentName:"p"},"t"),"."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 4))\n(assert (< (- y x) 1))\n(assert (> y 1))\n(minimize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) 4)\n)\n",error:"",status:"z3-ran",hash:"c05a4d79608f3ec5922d381c9de007dbeb526a5c"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("h2",{id:"unbounded-objectives"},"Unbounded Objectives"),(0,a.kt)("p",null,"Not all objective functions are bounded. Z3 indicates that the maxima are at infinity, and the minima are negative infinity."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 2))\n(assert (> (- y x) 1))\n(maximize (+ x y))\n(check-sat)\n",result:{output:"sat\n",error:"",status:"z3-ran",hash:"af360fa0fd21f40b97376c8bfa135834b3aebbb2"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 4))\n(assert (< (- y x) 1))\n(assert (< y 1))\n(minimize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) (* (- 1) oo))\n)\n",error:"",status:"z3-ran",hash:"f104a89e625948d3b3191acb4a15a4de75bcf07b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("h2",{id:"tight-bounds"},"Tight Bounds"),(0,a.kt)("p",null,"Not all finite bounds can be expressed as real numbers. Bounds obtained around strict inequalities are expressed using infinitesimals."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Real)\n(declare-const y Real)\n(assert (< x 4))\n(assert (< y 5))\n(maximize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) (+ 9.0 (* (- 2.0) epsilon)))\n)\n",error:"",status:"z3-ran",hash:"c78c626eead92d60c74647e5757036f4109eb2a3"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/adb42a35.f89c91d5.js b/assets/js/adb42a35.f89c91d5.js new file mode 100644 index 000000000..8656ab4f5 --- /dev/null +++ b/assets/js/adb42a35.f89c91d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4011],{5747:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>m,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>d,toc:()=>u});var n=i(7462),a=(i(7294),i(3905)),o=i(7634),r=i.n(o);const s={title:"Arithmetical Optimization",sidebar_position:3},l=void 0,d={unversionedId:"optimization/arithmeticaloptimization",id:"optimization/arithmeticaloptimization",title:"Arithmetical Optimization",description:"Z3 extends the The SMTLIB format with the following commands for working with optimization objectives:",source:"@site/docs-smtlib/04 - optimization/03 - arithmeticaloptimization.md",sourceDirName:"04 - optimization",slug:"/optimization/arithmeticaloptimization",permalink:"/z3guide/docs/optimization/arithmeticaloptimization",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/04 - optimization/03 - arithmeticaloptimization.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Arithmetical Optimization",sidebar_position:3},sidebar:"smtlibSidebar",previous:{title:"Optimization from the API",permalink:"/z3guide/docs/optimization/apioptimization"},next:{title:"Soft Constraints",permalink:"/z3guide/docs/optimization/softconstraints"}},m={},u=[{value:"Maximize and Minimize",id:"maximize-and-minimize",level:2},{value:"Unbounded Objectives",id:"unbounded-objectives",level:2},{value:"Tight Bounds",id:"tight-bounds",level:2}],c={toc:u};function p(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Z3 extends the The ",(0,a.kt)("a",{parentName:"p",href:"https://smt-lib.org/"},"SMTLIB format")," with the following commands for working with optimization objectives:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:null},"Command"),(0,a.kt)("th",{parentName:"tr",align:null},"Meaning"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(maximize t)")),(0,a.kt)("td",{parentName:"tr",align:null},"The result of ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," should seek to produce a model that ",(0,a.kt)("em",{parentName:"td"},"maximizes")," the value of ",(0,a.kt)("inlineCode",{parentName:"td"},"t"),". The expression can be integer, real or Bit-vector sort.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(minimize t)")),(0,a.kt)("td",{parentName:"tr",align:null},"The result of ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," should seek to produce a model that ",(0,a.kt)("em",{parentName:"td"},"minimizes")," the value of ",(0,a.kt)("inlineCode",{parentName:"td"},"t")," The expression can be integer, real or Bit-vector sort.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(add-soft b [:weight w] [:id id])")),(0,a.kt)("td",{parentName:"tr",align:null},"The result of ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," should seek to satisfy soft constraints. The default weight is 1. Weights are used to give priorities. Soft constraints can be grouped in disjoint groups by tagging them with optional identifiers.")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:null},(0,a.kt)("inlineCode",{parentName:"td"},"(get-objectives)")),(0,a.kt)("td",{parentName:"tr",align:null},"After ",(0,a.kt)("inlineCode",{parentName:"td"},"(check-sat)")," retrieve the values of the maximize, minimize and soft constraint objectives.")))),(0,a.kt)("h2",{id:"maximize-and-minimize"},"Maximize and Minimize"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"(maximize t)")," command instructs check-sat to produce a model that maximizes the value of term t. The type of ",(0,a.kt)("inlineCode",{parentName:"p"},"t")," must be either ",(0,a.kt)("inlineCode",{parentName:"p"},"Int"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"Real"),", or ",(0,a.kt)("inlineCode",{parentName:"p"},"BitVec"),"."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 2))\n(assert (< (- y x) 1))\n(maximize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) 2)\n)\n",error:"",status:"z3-ran",hash:"f9dfcc64cc935f2d972db0460ac87f91253205f5"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"(minimize t)")," command instructs check-sat to produce a model that minimizes the value of term ",(0,a.kt)("inlineCode",{parentName:"p"},"t"),"."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 4))\n(assert (< (- y x) 1))\n(assert (> y 1))\n(minimize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) 4)\n)\n",error:"",status:"z3-ran",hash:"c05a4d79608f3ec5922d381c9de007dbeb526a5c"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("h2",{id:"unbounded-objectives"},"Unbounded Objectives"),(0,a.kt)("p",null,"Not all objective functions are bounded. Z3 indicates that the maxima are at infinity, and the minima are negative infinity."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 2))\n(assert (> (- y x) 1))\n(maximize (+ x y))\n(check-sat)\n",result:{output:"sat\n",error:"",status:"z3-ran",hash:"af360fa0fd21f40b97376c8bfa135834b3aebbb2"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Int)\n(declare-const y Int)\n(assert (< x 4))\n(assert (< (- y x) 1))\n(assert (< y 1))\n(minimize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) (* (- 1) oo))\n)\n",error:"",status:"z3-ran",hash:"f104a89e625948d3b3191acb4a15a4de75bcf07b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,a.kt)("h2",{id:"tight-bounds"},"Tight Bounds"),(0,a.kt)("p",null,"Not all finite bounds can be expressed as real numbers. Bounds obtained around strict inequalities are expressed using infinitesimals."),(0,a.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x Real)\n(declare-const y Real)\n(assert (< x 4))\n(assert (< y 5))\n(maximize (+ x y))\n(check-sat)\n(get-objectives)",result:{output:"sat\n(objectives\n ((+ x y) (+ 9.0 (* (- 2.0) epsilon)))\n)\n",error:"",status:"z3-ran",hash:"c78c626eead92d60c74647e5757036f4109eb2a3"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b38a955c.553d8e02.js b/assets/js/b38a955c.553d8e02.js deleted file mode 100644 index a63839379..000000000 --- a/assets/js/b38a955c.553d8e02.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4026],{213:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>b,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var i=n(7462),s=(n(7294),n(3905)),o=n(7634),r=n.n(o);const l={title:"Recursive Functions",sidebar_position:7},u=void 0,a={unversionedId:"logic/Recursive Functions",id:"logic/Recursive Functions",title:"Recursive Functions",description:"SMTLIB2 standard: Page 62",source:"@site/docs-smtlib/01 - logic/07 - Recursive Functions.md",sourceDirName:"01 - logic",slug:"/logic/Recursive Functions",permalink:"/z3guide/docs/logic/Recursive Functions",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/01 - logic/07 - Recursive Functions.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Recursive Functions",sidebar_position:7},sidebar:"smtlibSidebar",previous:{title:"Lambdas",permalink:"/z3guide/docs/logic/Lambdas"},next:{title:"Conclusion",permalink:"/z3guide/docs/logic/Conclusion"}},c={},d=[{value:"Mutually Recursive Functions",id:"mutually-recursive-functions",level:2}],f={toc:d};function b(e){let{components:t,...n}=e;return(0,s.kt)("wrapper",(0,i.Z)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("blockquote",null,(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("strong",{parentName:"p"},"SMTLIB2")," standard: ",(0,s.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf"},"Page 62"))),(0,s.kt)("p",null,"You can define recursive functions"),(0,s.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-fun-rec length ((ls (List Int))) Int\n (if ((_ is nil) ls) 0 (+ 1 (length (tail ls)))))\n\n(define-fun-rec nat-list ((ls (List Int))) Bool \n (if ((_ is nil) ls)\n true\n (and (>= (head ls) 0) (nat-list (tail ls)))))\n\n(declare-const list1 (List Int))\n(declare-const list2 (List Int))\n(assert (> (length list1) (length list2)))\n(assert (not (nat-list list2)))\n(assert (nat-list list1))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun list2 () (List Int)\n (insert (- 1) nil))\n (define-fun list1 () (List Int)\n (insert 0 (insert 2437 nil)))\n)\n",error:"",status:"z3-ran",hash:"a0c65b977b47159c2c7b85fdd060098f6f0a34ca"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Z3 unfolds the definition of recursive functions incrementally by iterative deepening:\nit attempts first to establish satisfiability modulo a fixed bound on number of unfoldings;\nif the resulting formula is unsatisfiable ",(0,s.kt)("em",{parentName:"p"},"and")," the reason for unsatisfiability is due to the\nbound restriction, it increases the fixed bound incrementally. Note that this approach does not\ninvolve reasoning by induction that is often required to prove deeper properties of recursive functions.\nThis scheme allows to decide satisfiability and unsatisfiability for a limited, but often useful,\nclass of formulas."),(0,s.kt)("h2",{id:"mutually-recursive-functions"},"Mutually Recursive Functions"),(0,s.kt)("p",null,"You can also define functions that are mutually recursive.\nThe syntax requires to declare all functions first in one block, and then\ndefine the bodies of the recursive functions in a second block."),(0,s.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-funs-rec \n ((ping ((x Int) (y Bool)) Int)\n (pong ((a Int) (b Bool)) Int))\n\n ((if y (pong (+ x 1) (not y)) (- x 1))\n (if b (ping (- a 1) (not b)) a)))\n\n(declare-const x Int)\n(assert (> x 0))\n(assert (> (ping x true) x))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun x () Int\n 1)\n)\n",error:"",status:"z3-ran",hash:"8152b9332bd3e557e44fb09631fa11d4bb76bb0b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b38a955c.844bd020.js b/assets/js/b38a955c.844bd020.js new file mode 100644 index 000000000..10ce94d9c --- /dev/null +++ b/assets/js/b38a955c.844bd020.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4026],{213:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>b,frontMatter:()=>l,metadata:()=>u,toc:()=>d});var i=n(7462),s=(n(7294),n(3905)),o=n(7634),r=n.n(o);const l={title:"Recursive Functions",sidebar_position:7},a=void 0,u={unversionedId:"logic/Recursive Functions",id:"logic/Recursive Functions",title:"Recursive Functions",description:"SMTLIB2 standard: Page 62",source:"@site/docs-smtlib/01 - logic/07 - Recursive Functions.md",sourceDirName:"01 - logic",slug:"/logic/Recursive Functions",permalink:"/z3guide/docs/logic/Recursive Functions",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/01 - logic/07 - Recursive Functions.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Recursive Functions",sidebar_position:7},sidebar:"smtlibSidebar",previous:{title:"Lambdas",permalink:"/z3guide/docs/logic/Lambdas"},next:{title:"Conclusion",permalink:"/z3guide/docs/logic/Conclusion"}},c={},d=[{value:"Mutually Recursive Functions",id:"mutually-recursive-functions",level:2}],f={toc:d};function b(e){let{components:t,...n}=e;return(0,s.kt)("wrapper",(0,i.Z)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("blockquote",null,(0,s.kt)("p",{parentName:"blockquote"}," ",(0,s.kt)("strong",{parentName:"p"},"SMTLIB2")," standard: ",(0,s.kt)("a",{parentName:"p",href:"https://smt-lib.org/papers/smt-lib-reference-v2.6-r2021-05-12.pdf"},"Page 62"))),(0,s.kt)("p",null,"You can define recursive functions"),(0,s.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-fun-rec length ((ls (List Int))) Int\n (if ((_ is nil) ls) 0 (+ 1 (length (tail ls)))))\n\n(define-fun-rec nat-list ((ls (List Int))) Bool \n (if ((_ is nil) ls)\n true\n (and (>= (head ls) 0) (nat-list (tail ls)))))\n\n(declare-const list1 (List Int))\n(declare-const list2 (List Int))\n(assert (> (length list1) (length list2)))\n(assert (not (nat-list list2)))\n(assert (nat-list list1))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun list2 () (List Int)\n (insert (- 1) nil))\n (define-fun list1 () (List Int)\n (insert 0 (insert 2437 nil)))\n)\n",error:"",status:"z3-ran",hash:"a0c65b977b47159c2c7b85fdd060098f6f0a34ca"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,s.kt)("p",null,"Z3 unfolds the definition of recursive functions incrementally by iterative deepening:\nit attempts first to establish satisfiability modulo a fixed bound on number of unfoldings;\nif the resulting formula is unsatisfiable ",(0,s.kt)("em",{parentName:"p"},"and")," the reason for unsatisfiability is due to the\nbound restriction, it increases the fixed bound incrementally. Note that this approach does not\ninvolve reasoning by induction that is often required to prove deeper properties of recursive functions.\nThis scheme allows to decide satisfiability and unsatisfiability for a limited, but often useful,\nclass of formulas."),(0,s.kt)("h2",{id:"mutually-recursive-functions"},"Mutually Recursive Functions"),(0,s.kt)("p",null,"You can also define functions that are mutually recursive.\nThe syntax requires to declare all functions first in one block, and then\ndefine the bodies of the recursive functions in a second block."),(0,s.kt)(r(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-funs-rec \n ((ping ((x Int) (y Bool)) Int)\n (pong ((a Int) (b Bool)) Int))\n\n ((if y (pong (+ x 1) (not y)) (- x 1))\n (if b (ping (- a 1) (not b)) a)))\n\n(declare-const x Int)\n(assert (> x 0))\n(assert (> (ping x true) x))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun x () Int\n 1)\n)\n",error:"",status:"z3-ran",hash:"8152b9332bd3e557e44fb09631fa11d4bb76bb0b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cb919464.096fc0e9.js b/assets/js/cb919464.096fc0e9.js new file mode 100644 index 000000000..d2f87f8ba --- /dev/null +++ b/assets/js/cb919464.096fc0e9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1214],{8484:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>m,toc:()=>u});var a=s(7462),i=(s(7294),s(3905)),r=s(7634),n=s.n(r);const o={title:"Bitvectors",sidebar_position:2},l=void 0,m={unversionedId:"theories/Bitvectors",id:"theories/Bitvectors",title:"Bitvectors",description:"SMTLIB2 standard The Theory of fixed sized bit-vectors",source:"@site/docs-smtlib/02 - theories/02 - Bitvectors.md",sourceDirName:"02 - theories",slug:"/theories/Bitvectors",permalink:"/z3guide/docs/theories/Bitvectors",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/02 - Bitvectors.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Bitvectors",sidebar_position:2},sidebar:"smtlibSidebar",previous:{title:"Arithmetic",permalink:"/z3guide/docs/theories/Arithmetic"},next:{title:"IEEE Floats",permalink:"/z3guide/docs/theories/IEEE Floats"}},c={},u=[{value:"Basic Bitvector Arithmetic",id:"basic-bitvector-arithmetic",level:3},{value:"Bitwise Operations",id:"bitwise-operations",level:3},{value:"Word operations",id:"word-operations",level:3},{value:"Predicates over Bitvectors",id:"predicates-over-bitvectors",level:3},{value:"BitVectors and Integers",id:"bitvectors-and-integers",level:3}],d={toc:u};function p(e){let{components:t,...s}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,s,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"}," ",(0,i.kt)("strong",{parentName:"p"},"SMTLIB2")," standard ",(0,i.kt)("a",{parentName:"p",href:"https://smt-lib.org/theories-FixedSizeBitVectors.shtml"},"The Theory of fixed sized bit-vectors"))),(0,i.kt)("p",null,"Modern CPUs and main-stream programming languages use arithmetic over fixed-size bit-vectors. The theory of bit-vectors allows modeling the precise semantics of unsigned and of signed two-complements arithmetic. There are a large number of supported functions and relations over bit-vectors. They are summarized on Z3's documentation ",(0,i.kt)("a",{parentName:"p",href:"https://z3prover.github.io/api/html/z3__api_8h.html"},"link"),". We will not try to give a comprehensive overview here, but touch on some of the main features."),(0,i.kt)("p",null,"In contrast to programming languages, such as C, C++, C#, Java, there is no distinction between signed and unsigned bit-vectors as numbers. Instead, the theory of bit-vectors provides special signed versions of arithmetical operations where it makes a difference whether the bit-vector is treated as signed or unsigned."),(0,i.kt)("p",null,"Z3 supports Bitvectors of arbitrary size. (","_"," BitVec n) is the sort of bitvectors whose length is n. Bitvector literals may be defined using binary, decimal and hexadecimal notation. In the binary and hexadecimal cases, the bitvector size is inferred from the number of characters. For example, the bitvector literal #b010 in binary format is a bitvector of size 3, and the bitvector literal #x0a0 in hexadecimal format is a bitvector of size 12. The size must be specified for bitvector literals in decimal format. For example, (","_"," bv10 32) is a bitvector of size 32 that represents the numeral 10. By default, Z3 display bitvectors in hexadecimal format if the bitvector size is a multiple of 4, and in binary otherwise. The command (set-option pp.bv-literals false) can be used to force Z3 to display bitvector literals in decimal format."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(display #b0100)\n(display (_ bv20 8))\n(display (_ bv20 7))\n(display #x0a) \n(set-option :pp.bv-literals false)\n(display #b0100)\n(display (_ bv20 8))\n(display (_ bv20 7))\n(display #x0a) ",result:{output:"#x4\n#x14\n#b0010100\n#x0a\n(_ bv4 4)\n(_ bv20 8)\n(_ bv20 7)\n(_ bv10 8)\n",error:"",status:"z3-ran",hash:"b1b211c6cc2d3bfcbd13ad29ec01dfa6150ec93b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"basic-bitvector-arithmetic"},"Basic Bitvector Arithmetic"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bvadd #x07 #x03)) ; addition\n(simplify (bvsub #x07 #x03)) ; subtraction\n(simplify (bvneg #x07)) ; unary minus\n(simplify (bvmul #x07 #x03)) ; multiplication\n(simplify (bvurem #x07 #x03)) ; unsigned remainder\n(simplify (bvsrem #x07 #x03)) ; signed remainder\n(simplify (bvsmod #x07 #x03)) ; signed modulo\n(simplify (bvshl #x07 #x03)) ; shift left\n(simplify (bvlshr #xf0 #x03)) ; unsigned (logical) shift right\n(simplify (bvashr #xf0 #x03)) ; signed (arithmetical) shift right",result:{output:"#x0a\n#x04\n#xf9\n#x15\n#x01\n#x01\n#x01\n#x38\n#x1e\n#xfe\n",error:"",status:"z3-ran",hash:"a8f60c9b869223fce655d1c2485a9bc63bb0b7b6"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"bitwise-operations"},"Bitwise Operations"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bvor #x6 #x3)) ; bitwise or\n(simplify (bvand #x6 #x3)) ; bitwise and\n(simplify (bvnot #x6)) ; bitwise not\n(simplify (bvnand #x6 #x3)) ; bitwise nand\n(simplify (bvnor #x6 #x3)) ; bitwise nor\n(simplify (bvxnor #x6 #x3)) ; bitwise xnor",result:{output:"#x7\n#x2\n#x9\n#xd\n#x8\n#xa\n",error:"",status:"z3-ran",hash:"8cb9f28fde344372da45b2c6ace0026163d89cd3"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("p",null,"We can prove a bitwise version of deMorgan's law"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x (_ BitVec 64))\n(declare-const y (_ BitVec 64))\n(assert (not (= (bvand (bvnot x) (bvnot y)) (bvnot (bvor x y)))))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"5700f66db565882868f1d83ba855aee79ec2fae7"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("p",null,"Let us illustrate a simple property of bit-wise arithmetic. There is a fast way to check that fixed size numbers are powers of two. It turns out that a bit-vector x is a power of two or zero if and only if x & (x - 1) is zero, where & represents the bitwise and. We check this for four bits below."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-fun is-power-of-two ((x (_ BitVec 4))) Bool \n (= #x0 (bvand x (bvsub x #x1))))\n(declare-const a (_ BitVec 4))\n(assert \n (not (= (is-power-of-two a) \n (or (= a #x0) \n (= a #x1) \n (= a #x2) \n (= a #x4) \n (= a #x8)))))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"5d0317eef640c2e2c0699495c555e27e479f4991"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"word-operations"},"Word operations"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a (_ BitVec 4))\n(simplify (concat a #x0 #x1 #x2))\n(simplify ((_ zero_extend 4) #xF))\n(simplify ((_ sign_extend 4) #xF))\n(simplify ((_ extract 15 8) #xABCD1234))\n(simplify ((_ rotate_left 4) #xABCD))\n(simplify ((_ rotate_right 4) #xABCD))\n(simplify ((_ repeat 3) #xABC))",result:{output:"(concat a #x012)\n#x0f\n#xff\n#x12\n#xbcda\n#xdabc\n#xabcabcabc\n",error:"",status:"z3-ran",hash:"b7ec1e2aaaea1afa80a1bb8cb30ed8b3d0bf09df"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"predicates-over-bitvectors"},"Predicates over Bitvectors"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bvule #x0a #xf0)) ; unsigned less or equal\n(simplify (bvult #x0a #xf0)) ; unsigned less than\n(simplify (bvuge #x0a #xf0)) ; unsigned greater or equal\n(simplify (bvugt #x0a #xf0)) ; unsigned greater than\n(simplify (bvsle #x0a #xf0)) ; signed less or equal\n(simplify (bvslt #x0a #xf0)) ; signed less than\n(simplify (bvsge #x0a #xf0)) ; signed greater or equal\n(simplify (bvsgt #x0a #xf0)) ; signed greater than",result:{output:"true\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\ntrue\n",error:"",status:"z3-ran",hash:"019a690e4caef13ac059c48da847c5d9585baf9f"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("p",null,"Signed comparison, such as bvsle, takes the sign bit of bitvectors into account for comparison, while unsigned comparison treats the bitvector as unsigned (treats the bitvector as a natural number)."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a (_ BitVec 4))\n(declare-const b (_ BitVec 4))\n(assert (not (= (bvule a b) (bvsle a b))))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun b () (_ BitVec 4)\n #x6)\n (define-fun a () (_ BitVec 4)\n #x8)\n)\n",error:"",status:"z3-ran",hash:"216e910e4ce7a9f0338553fe1a08d0be3587f1fb"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"bitvectors-and-integers"},"BitVectors and Integers"),(0,i.kt)("p",null,"You can mix integers and bit-vectors.\nNote that reasoning in the combination has significant overhead so you\nwill be better off if you can model your problems entirely only using bit-vectors\nor entirely using integers (reals).\nIn the conversion function from bit-vectors to integers, bit-vectors correspond to non-negative integers.\nFor the conversion function that maps integers to bit-vectors you have to supply the bit-width ",(0,i.kt)("span",{parentName:"p",className:"math math-inline"},(0,i.kt)("span",{parentName:"span",className:"katex"},(0,i.kt)("span",{parentName:"span",className:"katex-mathml"},(0,i.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,i.kt)("semantics",{parentName:"math"},(0,i.kt)("mrow",{parentName:"semantics"},(0,i.kt)("mi",{parentName:"mrow"},"n")),(0,i.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,i.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,i.kt)("span",{parentName:"span",className:"base"},(0,i.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,i.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"))))),". Then the\nbit-vector corresponding to the integer argument represents the unsigned number obtained by taking the modulus\nwith respect to ",(0,i.kt)("span",{parentName:"p",className:"math math-inline"},(0,i.kt)("span",{parentName:"span",className:"katex"},(0,i.kt)("span",{parentName:"span",className:"katex-mathml"},(0,i.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,i.kt)("semantics",{parentName:"math"},(0,i.kt)("mrow",{parentName:"semantics"},(0,i.kt)("msup",{parentName:"mrow"},(0,i.kt)("mn",{parentName:"msup"},"2"),(0,i.kt)("mi",{parentName:"msup"},"n"))),(0,i.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"2^n")))),(0,i.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,i.kt)("span",{parentName:"span",className:"base"},(0,i.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6644em"}}),(0,i.kt)("span",{parentName:"span",className:"mord"},(0,i.kt)("span",{parentName:"span",className:"mord"},"2"),(0,i.kt)("span",{parentName:"span",className:"msupsub"},(0,i.kt)("span",{parentName:"span",className:"vlist-t"},(0,i.kt)("span",{parentName:"span",className:"vlist-r"},(0,i.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.6644em"}},(0,i.kt)("span",{parentName:"span",style:{top:"-3.063em",marginRight:"0.05em"}},(0,i.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,i.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,i.kt)("span",{parentName:"span",className:"mord mathnormal mtight"},"n")))))))))))),"."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bv2int #xa0))\n(simplify ((_ int2bv 32) -3))",result:{output:"160\n#xfffffffd\n",error:"",status:"z3-ran",hash:"749ef8bb127d93a9314411020915597b638d7bc2"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cb919464.92a82bc6.js b/assets/js/cb919464.92a82bc6.js deleted file mode 100644 index e8b187adb..000000000 --- a/assets/js/cb919464.92a82bc6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1214],{8484:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>m,toc:()=>u});var a=s(7462),i=(s(7294),s(3905)),r=s(7634),n=s.n(r);const o={title:"Bitvectors",sidebar_position:2},l=void 0,m={unversionedId:"theories/Bitvectors",id:"theories/Bitvectors",title:"Bitvectors",description:"SMTLIB2 standard The Theory of fixed sized bit-vectors",source:"@site/docs-smtlib/02 - theories/02 - Bitvectors.md",sourceDirName:"02 - theories",slug:"/theories/Bitvectors",permalink:"/z3guide/docs/theories/Bitvectors",draft:!1,editUrl:"https://github.com/microsoft/z3guide/tree/main/website/docs-smtlib/02 - theories/02 - Bitvectors.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Bitvectors",sidebar_position:2},sidebar:"smtlibSidebar",previous:{title:"Arithmetic",permalink:"/z3guide/docs/theories/Arithmetic"},next:{title:"IEEE Floats",permalink:"/z3guide/docs/theories/IEEE Floats"}},c={},u=[{value:"Basic Bitvector Arithmetic",id:"basic-bitvector-arithmetic",level:3},{value:"Bitwise Operations",id:"bitwise-operations",level:3},{value:"Word operations",id:"word-operations",level:3},{value:"Predicates over Bitvectors",id:"predicates-over-bitvectors",level:3},{value:"BitVectors and Integers",id:"bitvectors-and-integers",level:3}],d={toc:u};function p(e){let{components:t,...s}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,s,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"}," ",(0,i.kt)("strong",{parentName:"p"},"SMTLIB2")," standard ",(0,i.kt)("a",{parentName:"p",href:"http://smtlib.cs.uiowa.edu/theories-FixedSizeBitVectors.shtml"},"The Theory of fixed sized bit-vectors"))),(0,i.kt)("p",null,"Modern CPUs and main-stream programming languages use arithmetic over fixed-size bit-vectors. The theory of bit-vectors allows modeling the precise semantics of unsigned and of signed two-complements arithmetic. There are a large number of supported functions and relations over bit-vectors. They are summarized on Z3's documentation ",(0,i.kt)("a",{parentName:"p",href:"https://z3prover.github.io/api/html/z3__api_8h.html"},"link"),". We will not try to give a comprehensive overview here, but touch on some of the main features."),(0,i.kt)("p",null,"In contrast to programming languages, such as C, C++, C#, Java, there is no distinction between signed and unsigned bit-vectors as numbers. Instead, the theory of bit-vectors provides special signed versions of arithmetical operations where it makes a difference whether the bit-vector is treated as signed or unsigned."),(0,i.kt)("p",null,"Z3 supports Bitvectors of arbitrary size. (","_"," BitVec n) is the sort of bitvectors whose length is n. Bitvector literals may be defined using binary, decimal and hexadecimal notation. In the binary and hexadecimal cases, the bitvector size is inferred from the number of characters. For example, the bitvector literal #b010 in binary format is a bitvector of size 3, and the bitvector literal #x0a0 in hexadecimal format is a bitvector of size 12. The size must be specified for bitvector literals in decimal format. For example, (","_"," bv10 32) is a bitvector of size 32 that represents the numeral 10. By default, Z3 display bitvectors in hexadecimal format if the bitvector size is a multiple of 4, and in binary otherwise. The command (set-option pp.bv-literals false) can be used to force Z3 to display bitvector literals in decimal format."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(display #b0100)\n(display (_ bv20 8))\n(display (_ bv20 7))\n(display #x0a) \n(set-option :pp.bv-literals false)\n(display #b0100)\n(display (_ bv20 8))\n(display (_ bv20 7))\n(display #x0a) ",result:{output:"#x4\n#x14\n#b0010100\n#x0a\n(_ bv4 4)\n(_ bv20 8)\n(_ bv20 7)\n(_ bv10 8)\n",error:"",status:"z3-ran",hash:"b1b211c6cc2d3bfcbd13ad29ec01dfa6150ec93b"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"basic-bitvector-arithmetic"},"Basic Bitvector Arithmetic"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bvadd #x07 #x03)) ; addition\n(simplify (bvsub #x07 #x03)) ; subtraction\n(simplify (bvneg #x07)) ; unary minus\n(simplify (bvmul #x07 #x03)) ; multiplication\n(simplify (bvurem #x07 #x03)) ; unsigned remainder\n(simplify (bvsrem #x07 #x03)) ; signed remainder\n(simplify (bvsmod #x07 #x03)) ; signed modulo\n(simplify (bvshl #x07 #x03)) ; shift left\n(simplify (bvlshr #xf0 #x03)) ; unsigned (logical) shift right\n(simplify (bvashr #xf0 #x03)) ; signed (arithmetical) shift right",result:{output:"#x0a\n#x04\n#xf9\n#x15\n#x01\n#x01\n#x01\n#x38\n#x1e\n#xfe\n",error:"",status:"z3-ran",hash:"a8f60c9b869223fce655d1c2485a9bc63bb0b7b6"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"bitwise-operations"},"Bitwise Operations"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bvor #x6 #x3)) ; bitwise or\n(simplify (bvand #x6 #x3)) ; bitwise and\n(simplify (bvnot #x6)) ; bitwise not\n(simplify (bvnand #x6 #x3)) ; bitwise nand\n(simplify (bvnor #x6 #x3)) ; bitwise nor\n(simplify (bvxnor #x6 #x3)) ; bitwise xnor",result:{output:"#x7\n#x2\n#x9\n#xd\n#x8\n#xa\n",error:"",status:"z3-ran",hash:"8cb9f28fde344372da45b2c6ace0026163d89cd3"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("p",null,"We can prove a bitwise version of deMorgan's law"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const x (_ BitVec 64))\n(declare-const y (_ BitVec 64))\n(assert (not (= (bvand (bvnot x) (bvnot y)) (bvnot (bvor x y)))))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"5700f66db565882868f1d83ba855aee79ec2fae7"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("p",null,"Let us illustrate a simple property of bit-wise arithmetic. There is a fast way to check that fixed size numbers are powers of two. It turns out that a bit-vector x is a power of two or zero if and only if x & (x - 1) is zero, where & represents the bitwise and. We check this for four bits below."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(define-fun is-power-of-two ((x (_ BitVec 4))) Bool \n (= #x0 (bvand x (bvsub x #x1))))\n(declare-const a (_ BitVec 4))\n(assert \n (not (= (is-power-of-two a) \n (or (= a #x0) \n (= a #x1) \n (= a #x2) \n (= a #x4) \n (= a #x8)))))\n(check-sat)",result:{output:"unsat\n",error:"",status:"z3-ran",hash:"5d0317eef640c2e2c0699495c555e27e479f4991"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"word-operations"},"Word operations"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a (_ BitVec 4))\n(simplify (concat a #x0 #x1 #x2))\n(simplify ((_ zero_extend 4) #xF))\n(simplify ((_ sign_extend 4) #xF))\n(simplify ((_ extract 15 8) #xABCD1234))\n(simplify ((_ rotate_left 4) #xABCD))\n(simplify ((_ rotate_right 4) #xABCD))\n(simplify ((_ repeat 3) #xABC))",result:{output:"(concat a #x012)\n#x0f\n#xff\n#x12\n#xbcda\n#xdabc\n#xabcabcabc\n",error:"",status:"z3-ran",hash:"b7ec1e2aaaea1afa80a1bb8cb30ed8b3d0bf09df"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"predicates-over-bitvectors"},"Predicates over Bitvectors"),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bvule #x0a #xf0)) ; unsigned less or equal\n(simplify (bvult #x0a #xf0)) ; unsigned less than\n(simplify (bvuge #x0a #xf0)) ; unsigned greater or equal\n(simplify (bvugt #x0a #xf0)) ; unsigned greater than\n(simplify (bvsle #x0a #xf0)) ; signed less or equal\n(simplify (bvslt #x0a #xf0)) ; signed less than\n(simplify (bvsge #x0a #xf0)) ; signed greater or equal\n(simplify (bvsgt #x0a #xf0)) ; signed greater than",result:{output:"true\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\ntrue\n",error:"",status:"z3-ran",hash:"019a690e4caef13ac059c48da847c5d9585baf9f"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("p",null,"Signed comparison, such as bvsle, takes the sign bit of bitvectors into account for comparison, while unsigned comparison treats the bitvector as unsigned (treats the bitvector as a natural number)."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(declare-const a (_ BitVec 4))\n(declare-const b (_ BitVec 4))\n(assert (not (= (bvule a b) (bvsle a b))))\n(check-sat)\n(get-model)",result:{output:"sat\n(\n (define-fun b () (_ BitVec 4)\n #x6)\n (define-fun a () (_ BitVec 4)\n #x8)\n)\n",error:"",status:"z3-ran",hash:"216e910e4ce7a9f0338553fe1a08d0be3587f1fb"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}),(0,i.kt)("h3",{id:"bitvectors-and-integers"},"BitVectors and Integers"),(0,i.kt)("p",null,"You can mix integers and bit-vectors.\nNote that reasoning in the combination has significant overhead so you\nwill be better off if you can model your problems entirely only using bit-vectors\nor entirely using integers (reals).\nIn the conversion function from bit-vectors to integers, bit-vectors correspond to non-negative integers.\nFor the conversion function that maps integers to bit-vectors you have to supply the bit-width ",(0,i.kt)("span",{parentName:"p",className:"math math-inline"},(0,i.kt)("span",{parentName:"span",className:"katex"},(0,i.kt)("span",{parentName:"span",className:"katex-mathml"},(0,i.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,i.kt)("semantics",{parentName:"math"},(0,i.kt)("mrow",{parentName:"semantics"},(0,i.kt)("mi",{parentName:"mrow"},"n")),(0,i.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,i.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,i.kt)("span",{parentName:"span",className:"base"},(0,i.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,i.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"))))),". Then the\nbit-vector corresponding to the integer argument represents the unsigned number obtained by taking the modulus\nwith respect to ",(0,i.kt)("span",{parentName:"p",className:"math math-inline"},(0,i.kt)("span",{parentName:"span",className:"katex"},(0,i.kt)("span",{parentName:"span",className:"katex-mathml"},(0,i.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,i.kt)("semantics",{parentName:"math"},(0,i.kt)("mrow",{parentName:"semantics"},(0,i.kt)("msup",{parentName:"mrow"},(0,i.kt)("mn",{parentName:"msup"},"2"),(0,i.kt)("mi",{parentName:"msup"},"n"))),(0,i.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"2^n")))),(0,i.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,i.kt)("span",{parentName:"span",className:"base"},(0,i.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6644em"}}),(0,i.kt)("span",{parentName:"span",className:"mord"},(0,i.kt)("span",{parentName:"span",className:"mord"},"2"),(0,i.kt)("span",{parentName:"span",className:"msupsub"},(0,i.kt)("span",{parentName:"span",className:"vlist-t"},(0,i.kt)("span",{parentName:"span",className:"vlist-r"},(0,i.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.6644em"}},(0,i.kt)("span",{parentName:"span",style:{top:"-3.063em",marginRight:"0.05em"}},(0,i.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,i.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,i.kt)("span",{parentName:"span",className:"mord mathnormal mtight"},"n")))))))))))),"."),(0,i.kt)(n(),{input:{lang:"z3",highlight:"clojure",statusCodes:{success:"z3-ran",timeout:"z3-timed-out",runError:"z3-failed",runtimeError:"z3-runtime-error"},code:"(simplify (bv2int #xa0))\n(simplify ((_ int2bv 32) -3))",result:{output:"160\n#xfffffffd\n",error:"",status:"z3-ran",hash:"749ef8bb127d93a9314411020915597b638d7bc2"},githubRepo:"Z3Prover/z3",editable:!1,readonly:!1,showLineNumbers:!0,langVersion:"4.12.1",tool:"z3-solver"},mdxType:"CustomCodeBlock"}))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.33e71e89.js b/assets/js/main.683cc17b.js similarity index 99% rename from assets/js/main.33e71e89.js rename to assets/js/main.683cc17b.js index eb0aa7394..fc9afb213 100644 --- a/assets/js/main.33e71e89.js +++ b/assets/js/main.683cc17b.js @@ -1,2 +1,2 @@ -/*! For license information please see main.33e71e89.js.LICENSE.txt */ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},8726:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8726),i=n.n(o),l=n(6887);const s={"06485bac":[()=>n.e(5617).then(n.t.bind(n,7085,19)),"/home/runner/work/z3guide/z3guide/website/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"06c6b9ce":[()=>Promise.all([n.e(532),n.e(8592),n.e(5217)]).then(n.bind(n,8594)),"@site/docs-smtlib/03 - strategies/04 - probes.md",8594],"073a52b7":[()=>Promise.all([n.e(532),n.e(8592),n.e(9612)]).then(n.bind(n,4218)),"@site/docs-smtlib/02 - theories/01 - Arithmetic.md",4218],"0a1ab64f":[()=>Promise.all([n.e(532),n.e(8592),n.e(1649)]).then(n.bind(n,1245)),"@site/docs-smtlib/01 - logic/05 - Quantifiers.md",1245],"0a3279a5":[()=>n.e(9143).then(n.t.bind(n,3769,19)),"/home/runner/work/z3guide/z3guide/website/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"0eeec111":[()=>Promise.all([n.e(532),n.e(8592),n.e(7593)]).then(n.bind(n,2137)),"@site/docs-smtlib/02 - theories/08 - Regular Expressions.md",2137],"10abeab5":[()=>Promise.all([n.e(532),n.e(8592),n.e(4905)]).then(n.bind(n,5918)),"@site/docs-smtlib/03 - strategies/01 - intro.md",5918],"1186e8df":[()=>Promise.all([n.e(532),n.e(8592),n.e(3340)]).then(n.bind(n,9595)),"@site/docs-programming/03 - Example Programs/04 - Formula Simplification.md",9595],17896441:[()=>Promise.all([n.e(532),n.e(8592),n.e(2085),n.e(7918)]).then(n.bind(n,3332)),"@theme/DocItem",3332],"195441a5":[()=>Promise.all([n.e(532),n.e(8592),n.e(2887)]).then(n.bind(n,6928)),"@site/docs-smtlib/02 - theories/07 - Sequences.md",6928],"1a4e3797":[()=>Promise.all([n.e(532),n.e(8592),n.e(7920)]).then(n.bind(n,9172)),"@theme/SearchPage",9172],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1df93b7f":[()=>Promise.all([n.e(532),n.e(3237)]).then(n.t.bind(n,5208,23)),"@site/src/pages/index.tsx",5208],"1f391b9e":[()=>Promise.all([n.e(532),n.e(8592),n.e(2085),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],28050364:[()=>Promise.all([n.e(8592),n.e(3182)]).then(n.bind(n,282)),"@site/src/pages/Acknowledgments.md",282],"2e0965f8":[()=>Promise.all([n.e(532),n.e(8592),n.e(1934)]).then(n.bind(n,5184)),"@site/docs-smtlib/04 - optimization/01 - intro.md",5184],"4429c81c":[()=>Promise.all([n.e(532),n.e(8592),n.e(897)]).then(n.bind(n,7050)),"@site/docs-programming/05 - API Reference.md",7050],"443667e7":[()=>Promise.all([n.e(532),n.e(8592),n.e(4626)]).then(n.bind(n,7454)),"@site/docs-smtlib/02 - theories/09 - Characters.md",7454],"45aa616d":[()=>Promise.all([n.e(532),n.e(8592),n.e(289)]).then(n.bind(n,2076)),"@site/docs-programming/03 - Example Programs/03 - SPACER.md",2076],"48fb7ea4":[()=>Promise.all([n.e(532),n.e(8592),n.e(7515)]).then(n.bind(n,4043)),"@site/docs-programming/02 - Z3 Python - Readonly/04 - Fixedpoints.md",4043],"4c5e69b3":[()=>Promise.all([n.e(532),n.e(8592),n.e(1150)]).then(n.bind(n,8518)),"@site/docs-smtlib/05 - fixedpoints/02 - basicdatalog.md",8518],"54fd2156":[()=>Promise.all([n.e(532),n.e(8592),n.e(5053)]).then(n.bind(n,3697)),"@site/docs-smtlib/01 - logic/01 - intro.md",3697],"58c54c08":[()=>Promise.all([n.e(532),n.e(8592),n.e(2030)]).then(n.bind(n,4672)),"@site/docs-smtlib/03 - strategies/06 - summary.md",4672],"5b85c3b2":[()=>Promise.all([n.e(532),n.e(8592),n.e(5223)]).then(n.bind(n,1106)),"@site/docs-smtlib/02 - theories/03 - IEEE Floats.md",1106],"5ddc85b0":[()=>Promise.all([n.e(532),n.e(8592),n.e(2219)]).then(n.bind(n,3146)),"@site/docs-programming/01 - Z3 JavaScript Examples.md",3146],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"6053633b":[()=>Promise.all([n.e(532),n.e(8592),n.e(1078)]).then(n.bind(n,6906)),"@site/docs-smtlib/02 - theories/04 - Arrays.md",6906],"64721ce9":[()=>Promise.all([n.e(532),n.e(8592),n.e(3113)]).then(n.bind(n,1061)),"@site/docs-programming/02 - Z3 Python - Readonly/02 - advanced.md",1061],"6e0e5780":[()=>n.e(8926).then(n.t.bind(n,5612,19)),"/home/runner/work/z3guide/z3guide/website/.docusaurus/docusaurus-plugin-content-docs/playground/plugin-route-context-module-100.json",5612],"700268b1":[()=>Promise.all([n.e(532),n.e(8592),n.e(7560)]).then(n.bind(n,2364)),"@site/docs-smtlib/03 - strategies/03 - tactics.md",2364],"7389dc14":[()=>Promise.all([n.e(532),n.e(8592),n.e(9326)]).then(n.bind(n,5357)),"@site/docs-smtlib/05 - fixedpoints/01 - intro.md",5357],"754b3097":[()=>Promise.all([n.e(532),n.e(8592),n.e(9291)]).then(n.bind(n,9347)),"@site/docs-smtlib/01 - logic/03 - propositional-logic.md",9347],"758a6945":[()=>Promise.all([n.e(532),n.e(8592),n.e(6885)]).then(n.bind(n,1174)),"@site/docs-smtlib/02 - theories/05 - Datatypes.md",1174],"766c6c5d":[()=>Promise.all([n.e(532),n.e(8592),n.e(1202)]).then(n.bind(n,439)),"@site/docs-smtlib/01 - logic/04 - Uninterpreted-functions-and-constants.md",439],76895455:[()=>Promise.all([n.e(532),n.e(8592),n.e(4366)]).then(n.bind(n,5957)),"@site/docs-playground/03 - test.md",5957],"7a606cbc":[()=>n.e(3399).then(n.t.bind(n,5745,19)),"/home/runner/work/z3guide/z3guide/website/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"7b689f34":[()=>Promise.all([n.e(532),n.e(8592),n.e(7864)]).then(n.bind(n,3798)),"@site/docs-programming/03 - Example Programs/05 - MBQI.md",3798],"825bcbd7":[()=>Promise.all([n.e(532),n.e(8592),n.e(344)]).then(n.bind(n,8911)),"@site/docs-smtlib/02 - theories/06 - Strings.md",8911],"87900bd0":[()=>Promise.all([n.e(532),n.e(8592),n.e(3327)]).then(n.bind(n,6617)),"@site/docs-smtlib/03 - strategies/07 - simplifiers-summary.md",6617],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9dc876bf":[()=>Promise.all([n.e(532),n.e(8592),n.e(392)]).then(n.bind(n,7224)),"@site/docs-programming/02 - Z3 Python - Readonly/01 - Introduction.md",7224],a652379a:[()=>Promise.all([n.e(532),n.e(8592),n.e(5814)]).then(n.bind(n,1947)),"@site/docs-playground/01 - Freeform Editing.md",1947],a9e3c423:[()=>n.e(4287).then(n.t.bind(n,767,19)),"~docs/programming/version-current-metadata-prop-751.json",767],adb42a35:[()=>Promise.all([n.e(532),n.e(8592),n.e(4011)]).then(n.bind(n,5747)),"@site/docs-smtlib/04 - optimization/03 - arithmeticaloptimization.md",5747],adb86f02:[()=>n.e(6731).then(n.t.bind(n,3465,19)),"/home/runner/work/z3guide/z3guide/website/.docusaurus/docusaurus-plugin-content-docs/programming/plugin-route-context-module-100.json",3465],b3502e91:[()=>Promise.all([n.e(532),n.e(8592),n.e(7500)]).then(n.bind(n,3568)),"@site/docs-programming/03 - Example Programs/01 - Cores and Satisfying Subsets.md",3568],b38a955c:[()=>Promise.all([n.e(532),n.e(8592),n.e(4026)]).then(n.bind(n,213)),"@site/docs-smtlib/01 - logic/07 - Recursive Functions.md",213],b4ec11a8:[()=>Promise.all([n.e(532),n.e(8592),n.e(843)]).then(n.bind(n,6524)),"@site/docs-programming/04 - Parameters.md",6524],b68ea0ea:[()=>Promise.all([n.e(532),n.e(8592),n.e(7968)]).then(n.bind(n,2669)),"@site/docs-playground/02 - Guess the Secret Formula.md",2669],bf5686f6:[()=>Promise.all([n.e(532),n.e(8592),n.e(3724)]).then(n.bind(n,4629)),"@site/docs-programming/03 - Example Programs/02 - User Propagator.md",4629],c3aeb5e2:[()=>Promise.all([n.e(532),n.e(8592),n.e(8764)]).then(n.bind(n,8922)),"@site/docs-smtlib/04 - optimization/04 - softconstraints.md",8922],ca36d6a6:[()=>Promise.all([n.e(532),n.e(8592),n.e(4692)]).then(n.bind(n,1921)),"@site/docs-smtlib/05 - fixedpoints/03 - engineforpdr.md",1921],cb919464:[()=>Promise.all([n.e(532),n.e(8592),n.e(1214)]).then(n.bind(n,8484)),"@site/docs-smtlib/02 - theories/02 - Bitvectors.md",8484],d074f678:[()=>n.e(3810).then(n.t.bind(n,2327,19)),"~docs/playground/version-current-metadata-prop-751.json",2327],d0f3c7cb:[()=>Promise.all([n.e(532),n.e(8592),n.e(538)]).then(n.bind(n,3607)),"@site/docs-smtlib/04 - optimization/07 - advancedtopics.md",3607],d2940f3d:[()=>Promise.all([n.e(532),n.e(8592),n.e(5647)]).then(n.bind(n,9332)),"@site/docs-smtlib/04 - optimization/05 - combiningobjectives.md",9332],d4e5791d:[()=>Promise.all([n.e(532),n.e(8592),n.e(7654)]).then(n.bind(n,9875)),"@site/docs-programming/06 - Proof Logs.md",9875],d720861d:[()=>Promise.all([n.e(532),n.e(8592),n.e(6759)]).then(n.bind(n,7258)),"@site/docs-smtlib/02 - theories/10 - Special Relations.md",7258],d7317efc:[()=>Promise.all([n.e(532),n.e(8592),n.e(2628)]).then(n.bind(n,614)),"@site/docs-smtlib/01 - logic/06 - Lambdas.md",614],e33d6ff1:[()=>Promise.all([n.e(532),n.e(8592),n.e(6932)]).then(n.bind(n,3197)),"@site/docs-smtlib/03 - strategies/02 - goals.md",3197],e643873c:[()=>Promise.all([n.e(532),n.e(8592),n.e(7454)]).then(n.bind(n,538)),"@site/docs-programming/02 - Z3 Python - Readonly/03 - Strategies.md",538],e7125874:[()=>Promise.all([n.e(532),n.e(8592),n.e(5213)]).then(n.bind(n,257)),"@site/docs-smtlib/01 - logic/08 - Conclusion.md",257],e867f36b:[()=>Promise.all([n.e(532),n.e(8592),n.e(8773)]).then(n.bind(n,7158)),"@site/docs-smtlib/04 - optimization/06 - asmallcasestudy.md",7158],ebd79e67:[()=>Promise.all([n.e(532),n.e(8592),n.e(7074)]).then(n.bind(n,2913)),"@site/docs-smtlib/04 - optimization/02 - apioptimization.md",2913],ee0ec331:[()=>Promise.all([n.e(532),n.e(8592),n.e(96)]).then(n.bind(n,7958)),"@site/docs-smtlib/03 - strategies/05 - simplifiers.md",7958],f3ee6518:[()=>Promise.all([n.e(532),n.e(8592),n.e(8073)]).then(n.bind(n,2371)),"@site/docs-smtlib/05 - fixedpoints/05 - syntax.md",2371],f71821c5:[()=>Promise.all([n.e(532),n.e(8592),n.e(8320)]).then(n.bind(n,9291)),"@site/docs-smtlib/01 - logic/02 - basiccommands.md",9291]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],g=(0,c.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/z3guide/Acknowledgments",component:f("/z3guide/Acknowledgments","e10"),exact:!0},{path:"/z3guide/search",component:f("/z3guide/search","3ca"),exact:!0},{path:"/z3guide/docs",component:f("/z3guide/docs","faa"),routes:[{path:"/z3guide/docs/fixedpoints/basicdatalog",component:f("/z3guide/docs/fixedpoints/basicdatalog","53a"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/fixedpoints/engineforpdr",component:f("/z3guide/docs/fixedpoints/engineforpdr","112"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/fixedpoints/intro",component:f("/z3guide/docs/fixedpoints/intro","673"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/fixedpoints/syntax",component:f("/z3guide/docs/fixedpoints/syntax","dde"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/basiccommands",component:f("/z3guide/docs/logic/basiccommands","156"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/Conclusion",component:f("/z3guide/docs/logic/Conclusion","1b6"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/intro",component:f("/z3guide/docs/logic/intro","202"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/Lambdas",component:f("/z3guide/docs/logic/Lambdas","c8d"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/propositional-logic",component:f("/z3guide/docs/logic/propositional-logic","9be"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/Quantifiers",component:f("/z3guide/docs/logic/Quantifiers","240"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/Recursive Functions",component:f("/z3guide/docs/logic/Recursive Functions","814"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/logic/Uninterpreted-functions-and-constants",component:f("/z3guide/docs/logic/Uninterpreted-functions-and-constants","81a"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/optimization/advancedtopics",component:f("/z3guide/docs/optimization/advancedtopics","45a"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/optimization/apioptimization",component:f("/z3guide/docs/optimization/apioptimization","6fc"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/optimization/arithmeticaloptimization",component:f("/z3guide/docs/optimization/arithmeticaloptimization","0a6"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/optimization/asmallcasestudy",component:f("/z3guide/docs/optimization/asmallcasestudy","92d"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/optimization/combiningobjectives",component:f("/z3guide/docs/optimization/combiningobjectives","2fc"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/optimization/intro",component:f("/z3guide/docs/optimization/intro","8ed"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/optimization/softconstraints",component:f("/z3guide/docs/optimization/softconstraints","e75"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/strategies/goals",component:f("/z3guide/docs/strategies/goals","f29"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/strategies/intro",component:f("/z3guide/docs/strategies/intro","1ce"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/strategies/probes",component:f("/z3guide/docs/strategies/probes","701"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/strategies/simplifiers",component:f("/z3guide/docs/strategies/simplifiers","de6"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/strategies/simplifiers-summary",component:f("/z3guide/docs/strategies/simplifiers-summary","7a5"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/strategies/summary",component:f("/z3guide/docs/strategies/summary","b37"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/strategies/tactics",component:f("/z3guide/docs/strategies/tactics","13e"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Arithmetic",component:f("/z3guide/docs/theories/Arithmetic","733"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Arrays",component:f("/z3guide/docs/theories/Arrays","ae4"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Bitvectors",component:f("/z3guide/docs/theories/Bitvectors","df6"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Characters",component:f("/z3guide/docs/theories/Characters","637"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Datatypes",component:f("/z3guide/docs/theories/Datatypes","3a3"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/IEEE Floats",component:f("/z3guide/docs/theories/IEEE Floats","976"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Regular Expressions",component:f("/z3guide/docs/theories/Regular Expressions","130"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Sequences",component:f("/z3guide/docs/theories/Sequences","a3c"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Special Relations",component:f("/z3guide/docs/theories/Special Relations","d1a"),exact:!0,sidebar:"smtlibSidebar"},{path:"/z3guide/docs/theories/Strings",component:f("/z3guide/docs/theories/Strings","446"),exact:!0,sidebar:"smtlibSidebar"}]},{path:"/z3guide/playground",component:f("/z3guide/playground","163"),routes:[{path:"/z3guide/playground/Freeform Editing",component:f("/z3guide/playground/Freeform Editing","cef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/playground/Guess the Secret Formula",component:f("/z3guide/playground/Guess the Secret Formula","968"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/playground/test",component:f("/z3guide/playground/test","54f"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/z3guide/programming",component:f("/z3guide/programming","17b"),routes:[{path:"/z3guide/programming/API Reference",component:f("/z3guide/programming/API Reference","85b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Example Programs/Cores and Satisfying Subsets",component:f("/z3guide/programming/Example Programs/Cores and Satisfying Subsets","d24"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Example Programs/Formula Simplification",component:f("/z3guide/programming/Example Programs/Formula Simplification","40e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Example Programs/MBQI",component:f("/z3guide/programming/Example Programs/MBQI","dd0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Example Programs/SPACER",component:f("/z3guide/programming/Example Programs/SPACER","0e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Example Programs/User Propagator",component:f("/z3guide/programming/Example Programs/User Propagator","a24"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Parameters",component:f("/z3guide/programming/Parameters","8b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Proof Logs",component:f("/z3guide/programming/Proof Logs","26a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Z3 JavaScript Examples",component:f("/z3guide/programming/Z3 JavaScript Examples","f53"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Z3 Python - Readonly/advanced",component:f("/z3guide/programming/Z3 Python - Readonly/advanced","335"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Z3 Python - Readonly/Fixedpoints",component:f("/z3guide/programming/Z3 Python - Readonly/Fixedpoints","30c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Z3 Python - Readonly/Introduction",component:f("/z3guide/programming/Z3 Python - Readonly/Introduction","0ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/z3guide/programming/Z3 Python - Readonly/Strategies",component:f("/z3guide/programming/Z3 Python - Readonly/Strategies","5f7"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/z3guide/",component:f("/z3guide/","5da"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),g=n(2263),h=n(4996),b=n(6668),v=n(833),y=n(4711),w=n(9727),E=n(3320),k=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.default)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.default)(),a=function(){const{siteConfig:{url:e}}=(0,g.default)(),{pathname:t}=(0,c.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,g.default)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(k.Z,{tag:E.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var P=n(8934),A=n(8940);function L(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r(t.default?.[e]??t[e])?.(...n)));return()=>a.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1));document.getElementById(e)?.scrollIntoView()}else window.scrollTo(0,0)}(n),L("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function O(e){const t=(0,d.f)(u.Z,e);return Promise.all(t.map((e=>e.route.component.preload?.())))}class z extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(R,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const N=z,I="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",D="__DOCUSAURUS_INSERT_BASEURL_BANNER";function F(e){return`\nwindow['${D}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${D}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${I}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[D]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,F(e))),r.createElement("div",{id:I}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.default)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(B,null):null}function $(){const{siteConfig:{favicon:e,title:t},i18n:{currentLocale:n,localeConfigs:a}}=(0,g.default)(),o=(0,h.Z)(e),{htmlLang:i,direction:l}=a[n];return r.createElement(m.Z,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),e&&r.createElement("link",{rel:"icon",href:o}))}var j=n(4763);function H(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(j.Z,null,r.createElement(A.M,null,r.createElement(P.t,null,r.createElement(f,null,r.createElement($,null),r.createElement(_,null),r.createElement(U,null),r.createElement(N,{location:T(t)},e)))))}var Z=n(6887);const V=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();(document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode)?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var G=n(9670);const W=new Set,q=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Y={prefetch(e){if(!(e=>!K()&&!q.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(Z).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,G.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?V(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!q.has(e))(e)&&(q.add(e),O(e))},Q=Object.freeze(Y);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/z3guide/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/z3guide/docs","mainDocId":"logic/intro","docs":[{"id":"fixedpoints/basicdatalog","path":"/z3guide/docs/fixedpoints/basicdatalog","sidebar":"smtlibSidebar"},{"id":"fixedpoints/engineforpdr","path":"/z3guide/docs/fixedpoints/engineforpdr","sidebar":"smtlibSidebar"},{"id":"fixedpoints/intro","path":"/z3guide/docs/fixedpoints/intro","sidebar":"smtlibSidebar"},{"id":"fixedpoints/syntax","path":"/z3guide/docs/fixedpoints/syntax","sidebar":"smtlibSidebar"},{"id":"logic/basiccommands","path":"/z3guide/docs/logic/basiccommands","sidebar":"smtlibSidebar"},{"id":"logic/Conclusion","path":"/z3guide/docs/logic/Conclusion","sidebar":"smtlibSidebar"},{"id":"logic/intro","path":"/z3guide/docs/logic/intro","sidebar":"smtlibSidebar"},{"id":"logic/Lambdas","path":"/z3guide/docs/logic/Lambdas","sidebar":"smtlibSidebar"},{"id":"logic/propositional-logic","path":"/z3guide/docs/logic/propositional-logic","sidebar":"smtlibSidebar"},{"id":"logic/Quantifiers","path":"/z3guide/docs/logic/Quantifiers","sidebar":"smtlibSidebar"},{"id":"logic/Recursive Functions","path":"/z3guide/docs/logic/Recursive Functions","sidebar":"smtlibSidebar"},{"id":"logic/Uninterpreted-functions-and-constants","path":"/z3guide/docs/logic/Uninterpreted-functions-and-constants","sidebar":"smtlibSidebar"},{"id":"optimization/advancedtopics","path":"/z3guide/docs/optimization/advancedtopics","sidebar":"smtlibSidebar"},{"id":"optimization/apioptimization","path":"/z3guide/docs/optimization/apioptimization","sidebar":"smtlibSidebar"},{"id":"optimization/arithmeticaloptimization","path":"/z3guide/docs/optimization/arithmeticaloptimization","sidebar":"smtlibSidebar"},{"id":"optimization/asmallcasestudy","path":"/z3guide/docs/optimization/asmallcasestudy","sidebar":"smtlibSidebar"},{"id":"optimization/combiningobjectives","path":"/z3guide/docs/optimization/combiningobjectives","sidebar":"smtlibSidebar"},{"id":"optimization/intro","path":"/z3guide/docs/optimization/intro","sidebar":"smtlibSidebar"},{"id":"optimization/softconstraints","path":"/z3guide/docs/optimization/softconstraints","sidebar":"smtlibSidebar"},{"id":"strategies/goals","path":"/z3guide/docs/strategies/goals","sidebar":"smtlibSidebar"},{"id":"strategies/intro","path":"/z3guide/docs/strategies/intro","sidebar":"smtlibSidebar"},{"id":"strategies/probes","path":"/z3guide/docs/strategies/probes","sidebar":"smtlibSidebar"},{"id":"strategies/simplifiers","path":"/z3guide/docs/strategies/simplifiers","sidebar":"smtlibSidebar"},{"id":"strategies/simplifiers-summary","path":"/z3guide/docs/strategies/simplifiers-summary","sidebar":"smtlibSidebar"},{"id":"strategies/summary","path":"/z3guide/docs/strategies/summary","sidebar":"smtlibSidebar"},{"id":"strategies/tactics","path":"/z3guide/docs/strategies/tactics","sidebar":"smtlibSidebar"},{"id":"theories/Arithmetic","path":"/z3guide/docs/theories/Arithmetic","sidebar":"smtlibSidebar"},{"id":"theories/Arrays","path":"/z3guide/docs/theories/Arrays","sidebar":"smtlibSidebar"},{"id":"theories/Bitvectors","path":"/z3guide/docs/theories/Bitvectors","sidebar":"smtlibSidebar"},{"id":"theories/Characters","path":"/z3guide/docs/theories/Characters","sidebar":"smtlibSidebar"},{"id":"theories/Datatypes","path":"/z3guide/docs/theories/Datatypes","sidebar":"smtlibSidebar"},{"id":"theories/IEEE Floats","path":"/z3guide/docs/theories/IEEE Floats","sidebar":"smtlibSidebar"},{"id":"theories/Regular Expressions","path":"/z3guide/docs/theories/Regular Expressions","sidebar":"smtlibSidebar"},{"id":"theories/Sequences","path":"/z3guide/docs/theories/Sequences","sidebar":"smtlibSidebar"},{"id":"theories/Special Relations","path":"/z3guide/docs/theories/Special Relations","sidebar":"smtlibSidebar"},{"id":"theories/Strings","path":"/z3guide/docs/theories/Strings","sidebar":"smtlibSidebar"}],"draftIds":[],"sidebars":{"smtlibSidebar":{"link":{"path":"/z3guide/docs/logic/intro","label":"logic/intro"}}}}],"breadcrumbs":true},"programming":{"path":"/z3guide/programming","versions":[{"name":"current","label":"Next","isLast":true,"path":"/z3guide/programming","mainDocId":"Z3 JavaScript Examples","docs":[{"id":"API Reference","path":"/z3guide/programming/API Reference","sidebar":"tutorialSidebar"},{"id":"Example Programs/Cores and Satisfying Subsets","path":"/z3guide/programming/Example Programs/Cores and Satisfying Subsets","sidebar":"tutorialSidebar"},{"id":"Example Programs/Formula Simplification","path":"/z3guide/programming/Example Programs/Formula Simplification","sidebar":"tutorialSidebar"},{"id":"Example Programs/MBQI","path":"/z3guide/programming/Example Programs/MBQI","sidebar":"tutorialSidebar"},{"id":"Example Programs/SPACER","path":"/z3guide/programming/Example Programs/SPACER","sidebar":"tutorialSidebar"},{"id":"Example Programs/User Propagator","path":"/z3guide/programming/Example Programs/User Propagator","sidebar":"tutorialSidebar"},{"id":"Parameters","path":"/z3guide/programming/Parameters","sidebar":"tutorialSidebar"},{"id":"Proof Logs","path":"/z3guide/programming/Proof Logs","sidebar":"tutorialSidebar"},{"id":"Z3 JavaScript Examples","path":"/z3guide/programming/Z3 JavaScript Examples","sidebar":"tutorialSidebar"},{"id":"Z3 Python - Readonly/advanced","path":"/z3guide/programming/Z3 Python - Readonly/advanced","sidebar":"tutorialSidebar"},{"id":"Z3 Python - Readonly/Fixedpoints","path":"/z3guide/programming/Z3 Python - Readonly/Fixedpoints","sidebar":"tutorialSidebar"},{"id":"Z3 Python - Readonly/Introduction","path":"/z3guide/programming/Z3 Python - Readonly/Introduction","sidebar":"tutorialSidebar"},{"id":"Z3 Python - Readonly/Strategies","path":"/z3guide/programming/Z3 Python - Readonly/Strategies","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/z3guide/programming/Z3 JavaScript Examples","label":"Z3 JavaScript Examples"}}}}],"breadcrumbs":true},"playground":{"path":"/z3guide/playground","versions":[{"name":"current","label":"Next","isLast":true,"path":"/z3guide/playground","mainDocId":"Freeform Editing","docs":[{"id":"Freeform Editing","path":"/z3guide/playground/Freeform Editing","sidebar":"tutorialSidebar"},{"id":"Guess the Secret Formula","path":"/z3guide/playground/Guess the Secret Formula","sidebar":"tutorialSidebar"},{"id":"test","path":"/z3guide/playground/test","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/z3guide/playground/Freeform Editing","label":"Freeform Editing"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.0.1","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.0.1"},"add-z3-files":{"type":"project"},"custom-webpack-config":{"type":"project"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7294),a=n(412),o=n(5742),i=n(9803);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.default,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??u)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.default)(),{withBaseUrl:E}=(0,d.C)(),k=(0,a.useContext)(c),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=f||p;const _=(0,s.Z)(x),C=x?.replace("pathname://","");let T=void 0!==C?(P=C,b&&(e=>e.startsWith("/"))(P)?E(P):P):void 0;var P;T&&_&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const A=(0,a.useRef)(!1),L=n?o.OL:o.rU,R=u.Z.canUseIntersectionObserver,O=(0,a.useRef)();(0,a.useEffect)((()=>(!R&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{R&&O.current&&O.current.disconnect()})),[O,T,R,_]);const z=T?.startsWith("#")??!1,N=!T||!_||z;return N||h||k.collectLink(T),N?a.createElement("a",(0,r.Z)({ref:S,href:T},x&&!_&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(L,(0,r.Z)({},v,{onMouseEnter:()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)},innerRef:e=>{S.current=e,R&&e&&_&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),O.current.observe(e))},to:T},n&&{isActive:g,activeClassName:m}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>i});var r=n(2263),a=n(3919);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.default)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[a,o]=n;const i=r?`${r}.${a}`:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>h,gB:()=>g});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.default)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function u(e,t){const n=s(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},d=()=>i("docusaurus-plugin-content-docs")??c,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e)?.[t];if(!r&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return r}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function g(e){return f(e).versions}function h(e){const t=f(e);return l(t)}function b(e){const t=f(e),{pathname:n}=(0,r.TH)();return u(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:u(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(4961)(`./prism-${e}`)})),delete globalThis.Prism}(r.default)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},9803:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>kt});var r=n(7294),a=n(6010),o=n(4763),i=n(833),l=n(5281),s=n(9727),u=n(5999),c=n(6550),d=n(5936);function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const p="skipToContent_fXgn";function m(){const{containerRef:e,handleSkip:t}=function(){const e=(0,r.useRef)(null),{action:t}=(0,c.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.querySelector(`.${l.k.wrapper.main}`);t&&f(t)}),[]);return(0,d.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,handleSkip:n}}();return r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:p,onClick:t},r.createElement(u.Z,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var g=n(6668),h=n(9689),b=n(7462);function v(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const y="announcementBar_mb4j",w="announcementBarPlaceholder_vyr4",E="announcementBarClose_gvF7",k="announcementBarContent_xLdY";function S(){const{isActive:e,close:t}=(0,h.nT)(),{announcementBar:n}=(0,g.L)();if(!e)return null;const{content:o,backgroundColor:i,textColor:l,isCloseable:s}=n;return r.createElement("div",{className:y,style:{backgroundColor:i,color:l},role:"banner"},s&&r.createElement("div",{className:w}),r.createElement("div",{className:k,dangerouslySetInnerHTML:{__html:o}}),s?r.createElement("button",{type:"button",className:(0,a.default)("clean-btn close",E),onClick:t,"aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(v,{width:14,height:14,strokeWidth:3.1})):null)}var x=n(2961),_=n(2466);var C=n(902),T=n(3102);const P=r.createContext(null);function A(e){let{children:t}=e;const n=function(){const e=(0,x.e)(),t=(0,T.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,C.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(P.Provider,{value:n},t)}function L(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function R(){const e=(0,r.useContext)(P);if(!e)throw new C.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,T.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:L(o)})),[a,o,t])}function O(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=R();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.default)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var z=n(2949),N=n(2389);function I(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function M(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const D={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function F(e){let{className:t,value:n,onChange:o}=e;const i=(0,N.default)(),l=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.default)(D.toggle,t)},r.createElement("button",{className:(0,a.default)("clean-btn",D.toggleButton,!i&&D.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l},r.createElement(I,{className:(0,a.default)(D.toggleIcon,D.lightToggleIcon)}),r.createElement(M,{className:(0,a.default)(D.toggleIcon,D.darkToggleIcon)})))}const B=r.memo(F);function U(e){let{className:t}=e;const n=(0,g.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,z.I)();return n?null:r.createElement(B,{className:t,value:a,onChange:o})}var $=n(1327);function j(){return r.createElement($.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function H(){const e=(0,x.e)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(v,{color:"var(--ifm-color-emphasis-600)"}))}function Z(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(j,null),r.createElement(U,{className:"margin-right--md"}),r.createElement(H,null))}var V=n(9960),G=n(4996),W=n(3919),q=n(8022),K=n(9471);function Y(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:s,prependBaseUrlToHref:u,...c}=e;const d=(0,G.Z)(a),f=(0,G.Z)(t),p=(0,G.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,W.Z)(o),g=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(K.Z,s&&{width:12,height:12}))};return o?r.createElement(V.default,(0,b.Z)({href:u?p:o},c,g)):r.createElement(V.default,(0,b.Z)({to:d,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,q.F)(n,t.pathname):t.pathname.startsWith(f)},c,g))}function Q(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(Y,(0,b.Z)({className:(0,a.default)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function X(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(Y,(0,b.Z)({className:(0,a.default)("menu__link",t)},o)))}function J(e){let{mobile:t=!1,position:n,...a}=e;const o=t?X:Q;return r.createElement(o,(0,b.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ee=n(6043),te=n(8596),ne=n(2263);function re(e,t){return e.some((e=>function(e,t){return!!(0,te.Mg)(e.to,t)||!!(0,q.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ae(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,c]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&c(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[s]),r.createElement("div",{ref:s,className:(0,a.default)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(Y,(0,b.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.default)("navbar__link",o)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),c(!u))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>r.createElement(Me,(0,b.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),c(!1);const t=s.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function oe(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const s=function(){const{siteConfig:{baseUrl:e}}=(0,ne.default)(),{pathname:t}=(0,c.TH)();return t.replace(e,"/")}(),u=re(t,s),{collapsed:d,toggleCollapsed:f,setCollapsed:p}=(0,ee.u)({initialState:()=>!u});return(0,r.useEffect)((()=>{u&&p(!u)}),[s,u,p]),r.createElement("li",{className:(0,a.default)("menu__list-item",{"menu__list-item--collapsed":d})},r.createElement(Y,(0,b.Z)({role:"button",className:(0,a.default)("menu__link menu__link--sublist menu__link--sublist-caret",n)},l,{onClick:e=>{e.preventDefault(),f()}}),l.children??l.label),r.createElement(ee.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:d},t.map(((e,t)=>r.createElement(Me,(0,b.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function ie(e){let{mobile:t=!1,...n}=e;const a=t?oe:ae;return r.createElement(a,n)}var le=n(4711);function se(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ue="iconLanguage_nlXk";var ce=n(3935),de=n(5742),fe=n(6177);function pe(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var me=n(830),ge=["translations"];function he(){return he=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var we="Ctrl";var Ee=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=ye(e,ge),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,u=void 0===s?"Search":s,c=be((0,r.useState)(null),2),d=c[0],f=c[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(we))}),[]),r.createElement("button",he({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(me.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===we?r.createElement(pe,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),ke=n(3320);const Se={button:{buttonText:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,u.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,u.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,u.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,u.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,u.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,u.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,u.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,u.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,u.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,u.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,u.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,u.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,u.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,u.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,u.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,u.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,u.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,u.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,u.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let xe=null;function _e(e){let{hit:t,children:n}=e;return r.createElement(V.default,{to:t.url},n)}function Ce(e){let{state:t,onClose:n}=e;const{generateSearchPageLink:a}=(0,fe.O)();return r.createElement(V.default,{to:a(t.query),onClick:n},r.createElement(u.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Te(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,ne.default)(),l=function(){const{locale:e,tags:t}=(0,ke._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),s=o.searchParameters?.facetFilters??[],u=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(l,s):s,d={...o.searchParameters,facetFilters:u},{withBaseUrl:f}=(0,G.C)(),p=(0,c.k6)(),m=(0,r.useRef)(null),g=(0,r.useRef)(null),[h,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),E=(0,r.useCallback)((()=>xe?Promise.resolve():Promise.all([n.e(6780).then(n.bind(n,6780)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;xe=t}))),[]),k=(0,r.useCallback)((()=>{E().then((()=>{m.current=document.createElement("div"),document.body.insertBefore(m.current,document.body.firstChild),v(!0)}))}),[E,v]),S=(0,r.useCallback)((()=>{v(!1),m.current?.remove()}),[v]),x=(0,r.useCallback)((e=>{E().then((()=>{v(!0),w(e.key)}))}),[E,v,w]),_=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,q.F)(a,t)?window.location.href=t:p.push(t)}}).current,C=(0,r.useRef)((e=>e.map((e=>{if((0,q.F)(a,e.url))return e;const t=new URL(e.url);return{...e,url:f(`${t.pathname}${t.hash}`)}})))).current,T=(0,r.useMemo)((()=>e=>r.createElement(Ce,(0,b.Z)({},e,{onClose:S}))),[S]),P=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:h,onOpen:k,onClose:S,onInput:x,searchButtonRef:g}),r.createElement(r.Fragment,null,r.createElement(de.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(Ee,{onTouchStart:E,onFocus:E,onMouseOver:E,onClick:k,ref:g,translations:Se.button}),h&&xe&&m.current&&(0,ce.createPortal)(r.createElement(xe,(0,b.Z)({onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:_,transformItems:C,hitComponent:_e,transformSearchClient:P},o.searchPagePath&&{resultsFooterComponent:T},o,{searchParameters:d,placeholder:Se.placeholder,translations:Se.modal})),m.current))}function Pe(){const{siteConfig:e}=(0,ne.default)();return r.createElement(Te,e.themeConfig.algolia)}const Ae="searchBox_ZlJk";function Le(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.default)(n,Ae)},t)}var Re=n(143),Oe=n(3438);var ze=n(373);const Ne=e=>e.docs.find((t=>t.id===e.mainDocId));const Ie={default:J,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:l,localeConfigs:s}}=(0,ne.default)(),c=(0,le.l)(),d=[...n,...l.map((e=>{const n=`pathname://${c.createUrl({locale:e,fullyQualified:!1})}`;return{label:s[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],f=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):s[i].label;return r.createElement(ie,(0,b.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(se,{className:ue}),f),items:d}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Le,{className:n},r.createElement(Pe,null))},dropdown:ie,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.default)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Re.Iw)(a),l=(0,Oe.vY)(t,a);return null===l?null:r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>i?.path===l.path||!!i?.sidebar&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Re.Iw)(a),l=(0,Oe.oz)(t,a).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Oe.lO)(a)[0],l=t??i.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(J,(0,b.Z)({},o,{label:l,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...l}=e;const s=(0,Re.Iw)(n),c=(0,Re.gB)(n),{savePreferredVersionName:d}=(0,ze.J)(n),f=[...o,...c.map((e=>{const t=s.alternateDocVersions[e.name]??Ne(e);return{label:e.label,to:t.path,isActive:()=>e===s.activeVersion,onClick:()=>d(e.name)}})),...i],p=(0,Oe.lO)(n)[0],m=t&&f.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):p.label,g=t&&f.length>1?void 0:Ne(p).path;return f.length<=1?r.createElement(J,(0,b.Z)({},l,{mobile:t,label:m,to:g,isActive:a?()=>!1:void 0})):r.createElement(ie,(0,b.Z)({},l,{mobile:t,label:m,to:g,items:f,isActive:a?()=>!1:void 0}))}};function Me(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ie[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function De(){const e=(0,x.e)(),t=(0,g.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Me,(0,b.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Fe(e){return r.createElement("button",(0,b.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Be(){const e=0===(0,g.L)().navbar.items.length,t=R();return r.createElement(r.Fragment,null,!e&&r.createElement(Fe,{onClick:()=>t.hide()}),t.content)}function Ue(){const e=(0,x.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(O,{header:r.createElement(Z,null),primaryMenu:r.createElement(De,null),secondaryMenu:r.createElement(Be,null)}):null}const $e="navbarHideable_m1mJ",je="navbarHidden_jGov";function He(e){return r.createElement("div",(0,b.Z)({role:"presentation"},e,{className:(0,a.default)("navbar-sidebar__backdrop",e.className)}))}function Ze(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,g.L)(),i=(0,x.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,_.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(e)return t.location.hash?(a.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,a.default)("navbar","navbar--fixed-top",n&&[$e,!s&&je],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(He,{onClick:i.toggle}),r.createElement(Ue,null))}function Ve(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,b.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Ge(){const e=(0,x.e)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(Ve,null))}const We="colorModeToggle_DEke";function qe(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Me,(0,b.Z)({},e,{key:t})))))}function Ke(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ye(){const e=(0,x.e)(),t=(0,g.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Ke,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Ge,null),r.createElement(j,null),r.createElement(qe,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(qe,{items:a}),r.createElement(U,{className:We}),!o&&r.createElement(Le,null,r.createElement(Pe,null)))})}function Qe(){return r.createElement(Ze,null,r.createElement(Ye,null))}var Xe=n(2489);function Je(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,s=(0,G.Z)(n),u=(0,G.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(V.default,(0,b.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:s},l),o,a&&!(0,W.Z)(a)&&r.createElement(K.Z,null))}function et(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Je,{item:t}))}function tt(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(et,{key:t,item:e})))))}function nt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(tt,{key:t,column:e}))))}function rt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function at(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Je,{item:t})}function ot(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(at,{item:e}),t.length!==n+1&&r.createElement(rt,null))))))}function it(e){let{links:t}=e;return(0,Xe.a)(t)?r.createElement(nt,{columns:t}):r.createElement(ot,{links:t})}var lt=n(941);const st="footerLogoLink_BH7S";function ut(e){let{logo:t}=e;const{withBaseUrl:n}=(0,G.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(lt.Z,{className:(0,a.default)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function ct(e){let{logo:t}=e;return t.href?r.createElement(V.default,{href:t.href,className:st,target:t.target},r.createElement(ut,{logo:t})):r.createElement(ut,{logo:t})}function dt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ft(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.default)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function pt(){const{footer:e}=(0,g.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(ft,{style:o,links:n&&n.length>0&&r.createElement(it,{links:n}),logo:a&&r.createElement(ct,{logo:a}),copyright:t&&r.createElement(dt,{copyright:t})})}const mt=r.memo(pt);var gt=n(12);const ht="docusaurus.tab.",bt=r.createContext(void 0);const vt=(0,C.Qc)([z.S,h.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,gt.W)(`${ht}${e}`).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,gt._)().forEach((t=>{if(t.startsWith(ht)){const n=t.substring(ht.length);e[n]=(0,gt.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const a=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:a})),[e,a])}();return r.createElement(bt.Provider,{value:n},t)},_.OC,ze.L5,i.VC,function(e){let{children:t}=e;return r.createElement(T.n2,null,r.createElement(x.M,null,r.createElement(A,null,t)))}]);function yt(e){let{children:t}=e;return r.createElement(vt,null,t)}function wt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const Et="mainWrapper_z2l0";function kt(e){const{children:t,noFooter:n,wrapperClassName:u,title:c,description:d}=e;return(0,s.t)(),r.createElement(yt,null,r.createElement(i.d,{title:c,description:d}),r.createElement(m,null),r.createElement(S,null),r.createElement(Qe,null),r.createElement("div",{className:(0,a.default)(l.k.wrapper.main,Et,u)},r.createElement(o.Z,{fallback:e=>r.createElement(wt,e)},t)),!n&&r.createElement(mt,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.default)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),g=n?"":t,h=u?.alt??g;return a.createElement(o.default,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:h,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.default)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.default)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(7462),a=n(7294),o=n(412);function i(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function c(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??"ease-in-out"}`,height:`${t}px`}}function i(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return u(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,a.useRef)(null);return c({collapsibleRef:f,collapsed:n,animation:o}),a.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(f.current,n),i?.(n))},className:l},r)}function p(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(f,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?p:f;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.W)("docusaurus.announcement.dismiss"),u=(0,o.W)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.default)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.W)(u),d="light",f="dark",p=e=>e===f?f:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,r.useState)((e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(i(t),a&&(e=>{c.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[o,s])}function g(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b,Oh:()=>w});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(3438),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d=(e,t,n)=>{(0,u.W)(c(e),{persistence:t}).set(n)},f=(e,t)=>(0,u.W)(c(e),{persistence:t}).get(),p=(e,t)=>{(0,u.W)(c(e),{persistence:t}).del()};const m=r.createContext(null);function g(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return r.createElement(m.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,a._r)(),[t]=v();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),l=n(902);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{O:()=>l});var r=n(7294),a=n(6550),o=n(2263);const i="q";function l(){const e=(0,a.k6)(),{siteConfig:{baseUrl:t}}=(0,o.default)(),[n,l]=(0,r.useState)("");(0,r.useEffect)((()=>{const e=new URLSearchParams(window.location.search).get(i)??"";l(e)}),[]);return{searchQuery:n,setSearchQuery:(0,r.useCallback)((t=>{const n=new URLSearchParams(window.location.search);t?n.set(i,t):n.delete(i),e.replace({search:n.toString()}),l(t)}),[e]),generateSearchPageLink:(0,r.useCallback)((e=>`${t}search?${i}=${encodeURIComponent(e)}`),[t])}}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o="desktop",i="mobile",l="ssr";function s(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function u(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},3438:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>p,_F:()=>h,cE:()=>d,hI:()=>E,jA:()=>m,lO:()=>v,oz:()=>y,s1:()=>b,vY:()=>w});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116),u=n(7392),c=n(8596);const d=!!i._r;function f(e,t){for(const n of e)if("category"===n.type){if(t(n))return n;const e=f(n.items,t);if(e)return e}}function p(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=p(t);if(e)return e}}}function m(){const{pathname:e}=(0,a.TH)(),t=(0,s.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=f(t.items,(t=>(0,c.Mg)(t.href,e)));if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const g=(e,t)=>void 0!==e&&(0,c.Mg)(e,t);function h(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||((e,t)=>e.some((e=>h(e,t))))(e.items,t))}function b(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;if(!1===n||!e)return null;const r=[];return function e(n){for(const a of n)if("category"===a.type&&((0,c.Mg)(a.href,t)||e(a.items))||"link"===a.type&&(0,c.Mg)(a.href,t))return r.push(a),!0;return!1}(e.items),r.reverse()}function v(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},2489:(e,t,n)=>{"use strict";function r(e){return"title"in e[0]}n.d(t,{a:()=>r})},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.default)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2128);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=(0,u.p)(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.default)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.default)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,LI:()=>a,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.default)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.default)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),a=n(2263),o=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,a.default)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,o.Oh)();const u=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:u}}},12:(e,t,n)=>{"use strict";n.d(t,{W:()=>l,_:()=>s});const r="localStorage";function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t}}(e);const n=a(t?.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.default)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.default)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta,default:()=>o});const o=a},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>P,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,s=a(e),u=1;u{"use strict";n.r(t),n.d(t,{default:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,C=1;if(v){if(!(_=o(E,S,e,b))||_.index>=e.length)break;var T=_.index,P=_.index+_[0].length,A=S;for(A+=k.value.length;T>=A;)A+=(k=k.next).value.length;if(S=A-=k.value.length,k.value instanceof a)continue;for(var L=k;L!==t.tail&&(Ad.reach&&(d.reach=N);var I=k.prev;if(O&&(I=s(t,I,O),S+=O.length),u(t,I,C),k=s(t,I,new a(f,h?r.tokenize(R,h):R,y,R)),z&&s(t,k,z),C>1){var M={cause:f+","+m,reach:N};i(e,t,n,k.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},5520:()=>{!function(e){function t(e){return RegExp(/(\()/.source+"(?:"+e+")"+/(?=[\s\)])/.source)}function n(e){return RegExp(/([\s([])/.source+"(?:"+e+")"+/(?=[\s)])/.source)}var r=/(?!\d)[-+*/~!@$%^=<>{}\w]+/.source,a="&"+r,o="(\\()",i="(?=\\s)",l=/(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source,s={heading:{pattern:/;;;.*/,alias:["comment","title"]},comment:/;.*/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0,inside:{argument:/[-A-Z]+(?=[.,\s])/,symbol:RegExp("`"+r+"'")}},"quoted-symbol":{pattern:RegExp("#?'"+r),alias:["variable","symbol"]},"lisp-property":{pattern:RegExp(":"+r),alias:"property"},splice:{pattern:RegExp(",@?"+r),alias:["symbol","variable"]},keyword:[{pattern:RegExp(o+"(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)"+i),lookbehind:!0},{pattern:RegExp(o+"(?:append|by|collect|concat|do|finally|for|in|return)"+i),lookbehind:!0}],declare:{pattern:t(/declare/.source),lookbehind:!0,alias:"keyword"},interactive:{pattern:t(/interactive/.source),lookbehind:!0,alias:"keyword"},boolean:{pattern:n(/nil|t/.source),lookbehind:!0},number:{pattern:n(/[-+]?\d+(?:\.\d*)?/.source),lookbehind:!0},defvar:{pattern:RegExp(o+"def(?:const|custom|group|var)\\s+"+r),lookbehind:!0,inside:{keyword:/^def[a-z]+/,variable:RegExp(r)}},defun:{pattern:RegExp(o+/(?:cl-)?(?:defmacro|defun\*?)\s+/.source+r+/\s+\(/.source+l+/\)/.source),lookbehind:!0,greedy:!0,inside:{keyword:/^(?:cl-)?def\S+/,arguments:null,function:{pattern:RegExp("(^\\s)"+r),lookbehind:!0},punctuation:/[()]/}},lambda:{pattern:RegExp(o+"lambda\\s+\\(\\s*(?:&?"+r+"(?:\\s+&?"+r+")*\\s*)?\\)"),lookbehind:!0,greedy:!0,inside:{keyword:/^lambda/,arguments:null,punctuation:/[()]/}},car:{pattern:RegExp(o+r),lookbehind:!0},punctuation:[/(?:['`,]?\(|[)\[\]])/,{pattern:/(\s)\.(?=\s)/,lookbehind:!0}]},u={"lisp-marker":RegExp(a),varform:{pattern:RegExp(/\(/.source+r+/\s+(?=\S)/.source+l+/\)/.source),inside:s},argument:{pattern:RegExp(/(^|[\s(])/.source+r),lookbehind:!0,alias:"variable"},rest:s},c="\\S+(?:\\s+\\S+)*",d={pattern:RegExp(o+l+"(?=\\))"),lookbehind:!0,inside:{"rest-vars":{pattern:RegExp("&(?:body|rest)\\s+"+c),inside:u},"other-marker-vars":{pattern:RegExp("&(?:aux|optional)\\s+"+c),inside:u},keys:{pattern:RegExp("&key\\s+"+c+"(?:\\s+&allow-other-keys)?"),inside:u},argument:{pattern:RegExp(r),alias:"variable"},punctuation:/[()]/}};s.lambda.inside.arguments=d,s.defun.inside.arguments=e.util.clone(d),s.defun.inside.arguments.inside.sublist=d,e.languages.lisp=s,e.languages.elisp=s,e.languages.emacs=s,e.languages["emacs-lisp"]=s}(Prism)},4961:(e,t,n)=>{var r={"./prism-lisp":5520};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=4961},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n