More examples
We provide a zip file (maude-se-examples.zip
), containing example files.
File |
Description |
---|---|
smt-check-ex.maude |
A Maude file containing examples for the |
smt-search-ex.maude |
A Maude file containing examples for the |
smt-check-meta-ex.maude |
A Maude file containing examples for the |
smt-search-meta-ex.maude |
A Maude file containing examples for the |
smt-check-ex.maude
This file demonstrates the usage of check
with various theories and formulas, including both interpreted and uninterpreted symbols.
It contains four functional modules:
SIMPLE
EUF
EUF-ARRAY
EUF-XOR
1. The SIMPLE
module: A minimal example that imports the INTEGER module.
fmod SIMPLE is
pr INTEGER .
pr META-SMT-CHECK .
endfm
2. The EUF
module: Defines a new sort A
and declares f
as an uninterpreted function symbol.
fmod EUF is
pr BOOLEAN .
sort A .
op _===_ : A A -> Boolean .
op f : A -> A [ctor metadata "smt euf"] .
endfm
3. The EUF-ARRAY
module: Connects interpreted symbols from the SMT theory to Maude operators.
fmod ARRAY is
pr REAL-INTEGER .
sort Array{Integer,Integer} .
op _===_ : Array{Integer,Integer} Array{Integer,Integer} -> Boolean .
op select : Array{Integer,Integer} Integer -> Integer [metadata "smt array:select"] .
op _[_] : Array{Integer,Integer} Integer -> Integer [metadata "smt array:select"] .
op store : Array{Integer,Integer} Integer Integer -> Array{Integer,Integer} [metadata "smt array:store"] .
endfm
4. The EUF-XOR
module: Contains a single uninterpreted symbol.
fmod EUF-XOR is
pr INTEGER .
op _xor_ : Integer Integer -> Integer [metadata "smt euf"] .
endfm
As shown in the EUF
and EUF-XOR
modules, uninterpreted symbols can be declared by defining operators and annotating them with the metadata
attribute.
For example, the uninterpreted symbol f
in EUF
is annotated with metadata smt euf
, indicating that the operator is both an SMT symbol (smt
)
and an uninterpreted function (euf
).
Another module, ARRAY
, shows how to connect interpreted symbols to Maude using the metadata
attribute.
For example, the metadata smt array:select
is used to denote the interpreted symbol select
from the array
theory.
Additionally, a single interpreted symbol can be connected to multiple Maude operators.
In the ARRAY module, for instance, select
is associated with both select
and _[_]
.
Important
To connect interpreted symbols to Maude, you need to extend or implement an SMT converter.
As usual, we can check the satisfiability of various formulas under the EUF and Array theories. For example, the following formula can be checked using the QF_UF logic. Additional example commands are available in the file.
MaudeSE> check in EUF : f(f(X:A)) === X:A and f(X:A) === Y:A
and not (X:A === Y:A) using QF_UF .
result: sat
smt-check-meta-ex.maude
This file demonstrates the usage of metaSmtCheck
with several usage examples.
Satisfiability checking can be performed as explained in SMT Interface.
smt-search-ex.maude
This file includes examples demonstrating the use of smt-search
with the gcd
and robot
modules.
mod GCD is
pr INTEGER .
sorts GcdResult .
op gcd : Integer Integer -> GcdResult [ctor] .
op return : Integer -> GcdResult [ctor] .
vars X Y : Integer .
crl [r1] : gcd(X, Y) => gcd(X - Y, Y) if X > Y = true [nonexec] .
crl [r2] : gcd(X, Y) => gcd(X, Y - X) if X < Y = true [nonexec] .
rl [r3] : gcd(X, X) => return (X) .
endm
The following command searches for the first solution term that matches return(J)
and satisfies
the consition I < 9 and I > 0
, starting from the initial term gcd(10, I)
under the QF_LRA
logic.
MaudeSE> smt-search [1] in GCD : gcd(10, I:Integer) =>* return(J:Integer)
such that I:Integer > 0 and I:Integer < 9 using QF_LRA .
Solution 1 (state 3)
Symbolic state:
return(#5-V5:Integer)
Constraint:
V0:Integer === 10 and V1:Integer === I:Integer and ...
Substitution:
V2:Integer <-- #5-V5:Integer
Assignment:
#1-V12:Integer <-- 5
#2-V13:Integer <-- 5
...
I:Integer <-- 5
J:Integer <-- 5
V0:Integer <-- 10
V1:Integer <-- 5
V2:Integer <-- 5
Concrete state:
return(5)
omod ROBOT is
pr REAL .
class Robot | pos : Vector, vel : Vector, acc : Vector, time : Real .
sort Vector .
op [_,_] : Real Real -> Vector [ctor] .
endom
omod ROBOT-DYNAMICS is
pr ROBOT .
vars O : Oid .
vars CONST CONST' : Boolean .
vars PX VX AX PY VY AY PX' VX' AX' PY' VY' AY' T T' TAU : Real .
crl [move]:
< O : Robot | pos : [PX, PY], vel : [VX, VY],
acc : [AX, AY], time : T >
=> < O : Robot | pos : [PX', PY'], vel : [VX', VY'],
time : T + TAU >
if TAU >= 0/1 and VX' === VX + AX * TAU and VY' === VY + AY * TAU
and PX' === 1/2 * AX * TAU * TAU + VX * TAU + PX
and PY' === 1/2 * AY * TAU * TAU + VY * TAU + PY = true [nonexec] .
crl [accX]:
< O : Robot | acc : [AX, AY] >
=> < O : Robot | acc : [AX', AY] >
if AY === 0/1 = true [nonexec] .
crl [accY]:
< O : Robot | acc : [AX, AY] >
=> < O : Robot | acc : [AX, AY'] >
if AX === 0/1 = true [nonexec] .
op r : -> Oid [ctor] .
endom
This command searches for the first solution, using the QF_NRA
logic, that matches the goal pattern < r : Robot | pos : [NPX, NPY], ATTRSET >
and satisfies the consition NPX === 10/1 and NPY === 10/1
, starting from an initial term where all its attributes are set to zeros.
MaudeSE> smt-search [1] in ROBOT-DYNAMICS :
< r : Robot | pos : [IPX:Real, IPY:Real], vel : [IVX:Real, IVY:Real],
acc : [IAX:Real, IAY:Real], time : CLK:Real >
=>* < r : Robot | pos : [NPX:Real, NPY:Real], ATTRSET:AttributeSet >
such that NPX:Real === 10/1 and NPY:Real === 10/1
and IPX:Real === 0/1 and IPY:Real === 0/1 and IVX:Real === 0/1 and IVY:Real === 0/1
and IAX:Real === 0/1 and IAY:Real === 0/1 and CLK:Real === 0/1 using QF_NRA .
Solution 1 (state 180)
Symbolic state:
< r : Robot | pos : [#35-V24:Real, #36-V25:Real], vel : [#37-V26:Real, #38-V27:Real],
acc : [#39-V28:Real, #40-V29:Real], time : #41-V30:Real >
Constraint:
V0:Real === IPX:Real and V1:Real === IPY:Real and ...
Substitution:
ATTRSET:AttributeSet <-- vel : [#37-V26:Real, #38-V27:Real], ...
V7:Real <-- #35-V24:Real
V8:Real <-- #36-V25:Real
Assignment:
#1-V15:Real <-- 0/1
#10-V28:Real <-- 0/1
...
Concrete state:
< r : Robot | pos : [10/1, 10/1], vel : [20/1, 20/3], acc : [20/1, 0/1], time : 2/1 >
smt-search-meta-ex.maude
This file demonstrates the usage of metaSmtSearch
, corresponding to the two commands described in the previous section.
Module restrictions
Currently, we impose several restrictions on rewrite rules and equations:
The condition of a rewrite rule must be decomposed into pure SMT and non-SMT conditions.
Equations must not contradict or conflict with SMT theories.
When defining and connecting SMT symbols using metadata, equational axiom attributes (e.g., assoc, comm, id) must not be used together with metadata attributes.