试图在z3中实现GDL

时间:2013-08-01 07:14:38

标签: c# z3

我正在尝试在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?)。 我不确定如何获得'范围'或者'你'这个符号可以用整数表示。

1 个答案:

答案 0 :(得分:2)

这是一个值得研究的有趣问题。 对于Z3的背景,应牢记以下事项:

  1. 定点引擎(此时有几个后端) 不处理未解释的排序或未解释的功能。 你应该真的只使用有限域排序(布尔,位向量,枚举排序), 线性算术和某种程度上的递归数据类型排序。 对于角色的概念,枚举类似似乎是更好的匹配。 例如,player_x和player_y是两个不同的实体。
  2. 对于GDL,请考虑是否将GDL直接嵌入到Datalog中(没有否定)。 然后将这些写为Horn子句,例如,Horn子句就是定点引擎 称之为“规则”。
  3. 由于GDL包含几个内置操作,下一个是目标,终端和init 有特殊解释,GDL规则的解释不直接 对应于一组Horn子句(例如,据我所知,“next”是同步的) 使用转换系统首先理解GDL语义可能最容易, 更新状态变量的向量,然后从转换中提取Horn子句 系统(将转换系统转换为Horn子句的示例在http://rise4fun.com/Z3Py/tutorial/fixedpoints上给出) 然后使用Horn子句/规则写下过渡系统。