【问题标题】:Cyclic relation in Datalog using SMTLib for z3使用 SMTLib for z3 的 Datalog 中的循环关系
【发布时间】:2018-07-09 11:08:10
【问题描述】:

我想用 SMTLib 格式表达这个问题,并使用 Z3 进行评估。

edge("som1","som3").
edge("som2","som4").
edge("som4","som1").
edge("som3","som4").
path(x,y) :- edge(x,y). % x and y are strings
path(x,z) :- edge(x,y), path(y,z).
:- path(x,y), path(y,x). %cyclic path.

我的问题是如何编写检测关系路径中是否存在循环的规则(或查询)(基本数据日志中的此规则::- path(x,y), path(y,x))。

【问题讨论】:

  • 是的,但在链接中,他们使用二进制类型 ((define-sort s () (_BitVec 3)) 说明了图形示例,但对我来说,我想首先使用字符串而不是二进制并表达检测关系路径中是否存在循环的规则(或查询)(基本数据日志中的此规则::- path(x,y), path(y,x))。
  • 很高兴知道你到底在哪里卡住了,即到目前为止你尝试了什么。
  • 这就是我所做的:(set-option :fixedpoint.engine datalog) (define-sort s () (_ String 10)) (declare-rel edge (s s)) (declare-rel path (s s)) (declare-var a s) (declare-var b s) (declare-var c s) (rule (=> (edge a b) (path a b))) (rule (=> (and (path a b) (path b c))(路径 a c)))(规则(边缘“som1”“som2”))(规则(边缘“som2”“som3”))(规则(边缘“som3”“som1”))。我的问题是如何编写一个规则来检测路径关系中是否存在循环。
  • 我的意思是:(基本数据记录中的这条规则::- path(x,y),path(y,x))相当于:(false

标签: z3 z3py datalog


【解决方案1】:

Levent Erkok 指出的教程实际上包含所有正确的信息(我认为)。既不了解 Datalog 也不了解 Z3 的定点功能,我仍然能够拼凑以下内容:

(set-option :fixedpoint.engine datalog) 
(define-sort s () Int) 

(declare-rel edge (s s)) 
(declare-rel path (s s)) 

(declare-var a s) 
(declare-var b s) 
(declare-var c s) 

(rule (=> (edge a b) (path a b)) P-1)
(rule (=> (and (path a b) (path b c)) (path a c)) P-2)

(rule (edge 1 2) E-1)
(rule (edge 2 3) E-2)
(rule (edge 3 1) E-3)

(declare-rel cycle (s))
(rule (=> (path a a) (cycle a)))
(query cycle :print-answer true)

Z3 4.8.0每晚报sat,表示有循环,但是unsat如果有E-rules被去掉的话。

不过,我不得不使用整数而不是字符串,因为如果使用字符串,(我的版本)Z3 会中止并出现错误 Rule contains infinite sorts in rule P-1

【讨论】:

  • 请问如何获得 Z3 4.8.0,因为 Z3.7.1 是 github.com/Z3Prover/z3/releases 中最后一个适用于 windows 的版本。此版本返回错误: C:\Users\IEUser\Desktop>z3 stack.txt (error "query failed: Rule contains infinite sorts in rule P-1: path(#1,#0) :- edge(#1, #0). ") 未知
  • 现在可以了,谢谢,但在我的问题中,边缘应该是字符串而不是 Int。
  • Malte 的解决方案尽您所能。 Z3 的 DataLog 引擎对您可以使用的变量类型有限制;特别是在该域中不支持字符串。您必须在 z3 之外进行映射。
  • 不确定我是否理解您的问题...... 诚然,相当神秘的错误信息还不够正式吗?如果您想详细了解为什么不(还)支持与 DataLog 结合使用的字符串,您最好在 Z3 的问题跟踪器上提交增强请求。
  • 我从 NikolajBjorner 先生那里得到答案:定点引擎不支持字符串。 bddbddb 格式接受字符串作为有限域元素的名称,但这些不是真正的字符串,只是常量的名称。
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
相关资源
最近更新 更多