使用Z3的.datalog格式

时间:2018-06-11 15:01:26

标签: python z3 z3py datalog

我尝试使用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)解析这些程序。

1 个答案:

答案 0 :(得分:1)

如果您将该程序文本放在一个文件中(例如datalog),您可以直接在其上调用z3。 (请注意,扩展名必须为$ 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 )。

当我这样做时,我得到:

orderBy()

这是你想要做的吗?