我是Z3的新用户,并且希望它使用一些公理,并且只使用那些公理将公式简化为一阶逻辑中的另一个等效公式。 例如: 仅限使用
1.(p或q)和(p或r)< => p或(r和q)
2.not(p或q)< =>不是(p)而不是(q)
3.p和p< => p
证明
不是(p或(q和r))< => (不是(p)而不是(q))或(不是(p)而不是(r))
我使用的是C#API。 我想它必须使用未解释的功能,但我不知道该怎么做。
Plzz帮助。
答案 0 :(得分:1)
你是对的,想法是使用未解释的函数和排序。 这是Z3中编码的问题: http://rise4fun.com/Z3/Vzns
Z3没有找到使用您提供的3个公理的证明。 实际上,结论并没有从他们那里得出结论。 但是,如果我们替换公理,它可以找到证明
p和p< => P
与
not(not(p))< => P
备注:上述脚本中的编码使用未解释的排序B
而不是Bool
。因此,Z3也不会尝试通过案例分析进行证明,也不会尝试使用Bool
仅包含两个元素的事实。
备注:它使用=
代替<=>
。
在下面的例子中,我们使用Z3Py来构造一个满足你提供的3个公理的模型,但这个猜想并不成立。