【发布时间】: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