Java 用z3表示推理规则

Java 用z3表示推理规则,java,z3,Java,Z3,我一直在阅读和研究一些文档,但我仍然不清楚如何在z3中表示我的推理规则 假设我有以下两条推理规则: 我的z3规则是否如此简单: a。a^b=>c Ba^b=>c 或者,我认为更正确的是,我必须声明数据类型、记录、标量等等 从这里开始,从阅读文档开始,java实现看起来相当简单 正是从一个类型系统的推理规则到命题逻辑的最初转换让我感到困惑 我想我的推理规则a和b之间缺少了一些联系,在z3中表示它们;在我继续阅读文档的过程中,对于如何体现这些规则仍然是一个模糊的问题。Z3对于这项任务来说是一个不错的

我一直在阅读和研究一些文档,但我仍然不清楚如何在z3中表示我的推理规则

假设我有以下两条推理规则:

我的z3规则是否如此简单:

a。a^b=>c Ba^b=>c

或者,我认为更正确的是,我必须声明数据类型、记录、标量等等

从这里开始,从阅读文档开始,java实现看起来相当简单

正是从一个类型系统的推理规则到命题逻辑的最初转换让我感到困惑


我想我的推理规则a和b之间缺少了一些联系,在z3中表示它们;在我继续阅读文档的过程中,对于如何体现这些规则仍然是一个模糊的问题。

Z3对于这项任务来说是一个不错的选择,尽管很难完全理解您的问题是什么。你的a点和b点完全一样,是故意的吗?但从本质上讲,推理规则是含义,所以从命题和它们之间的含义的角度来考虑它们就可以了

此外,您的规则可能会有一个Horn结构,就像Prolog中的Horn子句一样,请参见此处:,而Z3有一个数据日志引擎,可以使编写此类问题更加容易


请参阅此处,以获得一个非常好的介绍:我认为可以相对轻松地将其应用到您的用例中。

这是有意完成的。我对实际语言的所有推理规则都遵循一种非常相似的模式——它是一种简单的语言。我可以简单地添加一段时间,或者如果:if Bool then{statement_1}else{statement_2}。甚至这个推理规则也将类似于“a”和“b”。while实际上与if相同。我正在努力从推理到命题的转换,我非常担心它们看起来几乎是一样的。当然,下一步是用这个操作程序中的AST。但这应该像遍历AST并将z3中的规则应用于树一样简单,我说的对吗?这听起来非常典型:您构建一个AST,然后象征性地遍历它以吐出约束。例如,类型推断可以用这些术语进行转换,听起来非常类似于您的应用程序。有关此想法的有趣应用,请参见此处: