.datalog 格式使用 Z3
.datalog format using Z3
我正在尝试使用 Z3 扩展:muZ 遵循本教程:https://rise4fun.com/Z3/tutorial/fixedpoints.
如本教程中所标记,接受三种不同的基于文本的输入格式。基本数据记录是这些可接受的格式之一。
我有教程中指出的这种形式的程序:
Z 64
P0(x: Z) input
Gt0(x : Z, y : Z) input
R(x : Z) printtuples
S(x : Z) printtuples
Gt(x : Z, y : Z) printtuples
Gt(x,y) :- Gt0(x,y).
Gt(x,y) :- Gt(x,z), Gt(z,y).
R(x) :- Gt(x,_).
S(x) :- Gt(x,x0), Gt0(x,y), Gt0(y,z), P0(z).
Gt0("a","b").
Gt0("b","c").
Gt0("c","d").
Gt0("a1","b").
Gt0("b","a1").
Gt0("d","d1").
Gt0("d1","d").
P0("a1").
如何使用 Z3Py(或 Z3)解析这些程序。
如果你把那个程序文本放在一个文件中(比如说a.datalog
),你可以直接在上面调用z3。 (请注意,扩展名必须是 datalog
)。
当我这样做时,我得到:
$ z3 a.datalog
Tuples in Gt:
(x=a(0),y=b(1))
(x=b(1),y=c(2))
(x=c(2),y=d(3))
(x=a1(4),y=b(1))
(x=b(1),y=a1(4))
(x=d(3),y=d1(5))
(x=d1(5),y=d(3))
(x=a(0),y=c(2))
(x=a(0),y=a1(4))
(x=b(1),y=d(3))
(x=c(2),y=d1(5))
(x=a1(4),y=c(2))
(x=a1(4),y=a1(4))
(x=b(1),y=b(1))
(x=d(3),y=d(3))
(x=d1(5),y=d1(5))
(x=a(0),y=d(3))
(x=a1(4),y=d(3))
(x=b(1),y=d1(5))
(x=a(0),y=d1(5))
(x=a1(4),y=d1(5))
Tuples in R:
(x=a(0))
(x=b(1))
(x=c(2))
(x=a1(4))
(x=d(3))
(x=d1(5))
Tuples in S:
(x=a(0))
(x=a1(4))
Time: 3ms
Parsing: 0ms, other: 1ms
这是你想要做的吗?
我正在尝试使用 Z3 扩展:muZ 遵循本教程:https://rise4fun.com/Z3/tutorial/fixedpoints.
如本教程中所标记,接受三种不同的基于文本的输入格式。基本数据记录是这些可接受的格式之一。
我有教程中指出的这种形式的程序:
Z 64
P0(x: Z) input
Gt0(x : Z, y : Z) input
R(x : Z) printtuples
S(x : Z) printtuples
Gt(x : Z, y : Z) printtuples
Gt(x,y) :- Gt0(x,y).
Gt(x,y) :- Gt(x,z), Gt(z,y).
R(x) :- Gt(x,_).
S(x) :- Gt(x,x0), Gt0(x,y), Gt0(y,z), P0(z).
Gt0("a","b").
Gt0("b","c").
Gt0("c","d").
Gt0("a1","b").
Gt0("b","a1").
Gt0("d","d1").
Gt0("d1","d").
P0("a1").
如何使用 Z3Py(或 Z3)解析这些程序。
如果你把那个程序文本放在一个文件中(比如说a.datalog
),你可以直接在上面调用z3。 (请注意,扩展名必须是 datalog
)。
当我这样做时,我得到:
$ z3 a.datalog
Tuples in Gt:
(x=a(0),y=b(1))
(x=b(1),y=c(2))
(x=c(2),y=d(3))
(x=a1(4),y=b(1))
(x=b(1),y=a1(4))
(x=d(3),y=d1(5))
(x=d1(5),y=d(3))
(x=a(0),y=c(2))
(x=a(0),y=a1(4))
(x=b(1),y=d(3))
(x=c(2),y=d1(5))
(x=a1(4),y=c(2))
(x=a1(4),y=a1(4))
(x=b(1),y=b(1))
(x=d(3),y=d(3))
(x=d1(5),y=d1(5))
(x=a(0),y=d(3))
(x=a1(4),y=d(3))
(x=b(1),y=d1(5))
(x=a(0),y=d1(5))
(x=a1(4),y=d1(5))
Tuples in R:
(x=a(0))
(x=b(1))
(x=c(2))
(x=a1(4))
(x=d(3))
(x=d1(5))
Tuples in S:
(x=a(0))
(x=a1(4))
Time: 3ms
Parsing: 0ms, other: 1ms
这是你想要做的吗?