我正在尝试在c#中使用z3实现一些GDL http://en.wikipedia.org/wiki/Game_Description_Language,而我几乎停留在起始块中。
基本上我想用以下gdl开始非常简单
(role you)
(init (state 0))
(<= (legal you proceed)
(true (state 0)))
(<= (next (state 1))
(does you proceed))
(<= terminal
(true (state 1)))
(<= (goal you 100))
然后查询哪些'合法'是可以满足的(在这个人为的例子中有 只有一个法律,并且在初始州是可以满足的)
查看z3示例,看起来我需要创建一个固定点
Fixedpoint fp = ctx.MkFixedpoint();
然后当我想添加事实
(role you)
我愿意
Sort domain=?;
Sort range=?;
FuncDecl pred = ctx.MkFuncDecl("role", domain, range);
uint you = 1;
fp.AddFact(pred, you);
但是我不知道域名应该是未解释的排序还是别的(enum sort?)。 我不确定如何获得'范围'或者'你'这个符号可以用整数表示。
答案 0 :(得分:2)
这是一个值得研究的有趣问题。 对于Z3的背景,应牢记以下事项:
由于GDL包含几个内置操作,下一个是目标,终端和init 有特殊解释,GDL规则的解释不直接 对应于一组Horn子句(例如,据我所知,“next”是同步的) 使用转换系统首先理解GDL语义可能最容易, 更新状态变量的向量,然后从转换中提取Horn子句 系统(将转换系统转换为Horn子句的示例在http://rise4fun.com/Z3Py/tutorial/fixedpoints上给出) 然后使用Horn子句/规则写下过渡系统。