C# Z3中多值逻辑公式的求值
我需要使用Z3在各种变量值上计算表达式的值。 我知道Z3是一个可满足性检查器,但model.Eval(Args)会在模型生成的变量值处对表达式进行求值 因此,我们可以迭代各种值来计算表达式 示例:p和q的所有可能值的p和q(p,q为布尔值) 所以在某种意义上,使用递归或迭代从中创建一个真值表。 Z3有没有可能这样做 对C#API的帮助会更好C# Z3中多值逻辑公式的求值,c#,z3,C#,Z3,我需要使用Z3在各种变量值上计算表达式的值。 我知道Z3是一个可满足性检查器,但model.Eval(Args)会在模型生成的变量值处对表达式进行求值 因此,我们可以迭代各种值来计算表达式 示例:p和q的所有可能值的p和q(p,q为布尔值) 所以在某种意义上,使用递归或迭代从中创建一个真值表。 Z3有没有可能这样做 对C#API的帮助会更好 谢谢你可以考虑C语言API中的方法替代< /代码>。它可用于用值替换常量,如p和q。它还简化/计算了应用替换后的公式 下面是一个使用Substitute的小
<>谢谢你可以考虑C语言API中的方法<代码>替代< /代码>。它可用于用值替换常量,如
p
和q
。它还简化/计算了应用替换后的公式
下面是一个使用Substitute
的小C#示例(来自我们的回归套件):
using Microsoft.Z3;
using System;
using System.Collections.Generic;
class Test
{
public void Run()
{
Dictionary<string, string> cfg = new Dictionary<string, string>() {
{ "AUTO_CONFIG", "true" } };
using (Context ctx = new Context(cfg))
{
IntExpr x = ctx.MkIntConst("x");
IntExpr y = ctx.MkIntConst("y");
FuncDecl f = ctx.MkFuncDecl("f", new Sort[] { ctx.IntSort, ctx.IntSort }, ctx.IntSort);
FuncDecl g = ctx.MkFuncDecl("g", new Sort[] { ctx.IntSort }, ctx.IntSort);
Expr n = f[f[g[x], g[g[x]]], g[g[y]]];
Console.WriteLine(n);
Expr nn = n.Substitute(new Expr[] { g[g[x]], g[y] },
new Expr[] { y, ctx.MkAdd(x, ctx.MkInt(1)) } );
Console.WriteLine(nn);
Console.WriteLine(n.Substitute(g[g[x]], y));
}
}
}
<>你可以考虑C语言API中的方法<代码>替代< /代码>。它可用于用值替换常量,如
p
和q
。它还简化/计算了应用替换后的公式
下面是一个使用Substitute
的小C#示例(来自我们的回归套件):
using Microsoft.Z3;
using System;
using System.Collections.Generic;
class Test
{
public void Run()
{
Dictionary<string, string> cfg = new Dictionary<string, string>() {
{ "AUTO_CONFIG", "true" } };
using (Context ctx = new Context(cfg))
{
IntExpr x = ctx.MkIntConst("x");
IntExpr y = ctx.MkIntConst("y");
FuncDecl f = ctx.MkFuncDecl("f", new Sort[] { ctx.IntSort, ctx.IntSort }, ctx.IntSort);
FuncDecl g = ctx.MkFuncDecl("g", new Sort[] { ctx.IntSort }, ctx.IntSort);
Expr n = f[f[g[x], g[g[x]]], g[g[y]]];
Console.WriteLine(n);
Expr nn = n.Substitute(new Expr[] { g[g[x]], g[y] },
new Expr[] { y, ctx.MkAdd(x, ctx.MkInt(1)) } );
Console.WriteLine(nn);
Console.WriteLine(n.Substitute(g[g[x]], y));
}
}
}
我已经要求用户输入一个逻辑表达式,并使用Z3通过检查其否定的可满足性来检查它是否是重言式。现在我想让用户看到表达式的计算结果总是true,因此它是重言式,如果不是重言式,然后向用户显示,它的计算结果并不总是真的,因此它不是重言式。我已经要求用户输入一个逻辑表达式,并使用Z3通过检查其否定的可满足性来检查它是否是重言式。现在,我希望用户看到表达式的计算结果始终为true,因此它是一个重言式,如果不是重言式,则向用户显示它的计算结果不总是true,因此它不是一个重言式。抱歉!您可能觉得这很傻,但我收到一个错误“错误1'Microsoft.Z3.Context'不包含'mkUnterpretedSort'的定义,并且找不到接受类型为'Microsoft.Z3.Context'的第一个参数的扩展方法'mkUnterpretedSort'(您是否缺少using指令或程序集引用?)C:\Users\Pulkit\Documents\Visual Studio 11\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs 11 26 ConsoleApplication4”和类似错误。我已经引用了所有Dll,并将它们粘贴到bin和bin/Debug目录中。请直接告诉我。这些示例是针对Z34.0的,它们基于新的.NETAPI。您使用的是哪个版本?下面是新API的文档:我尝试添加对z3-3.2和z3-4.0的引用。没有一个有效!!仍然感谢您的帮助>您能编译Z34.0附带的C#示例吗?您是否尝试使用Visual Studio命令提示符?要编译使用Z3的文件
tst.cs
,我使用以下命令行:csc/reference:[Z3_PATH]\bin\microsoft.Z3.dll/out:tst.exe tst.cs
否它也不会在命令提示符下编译,并给出相同的错误!!我确实包括了Microsoft.z3.dll作为参考,对不起!您可能觉得这很傻,但我收到一个错误“错误1'Microsoft.Z3.Context'不包含'mkUnterpretedSort'的定义,并且找不到接受类型为'Microsoft.Z3.Context'的第一个参数的扩展方法'mkUnterpretedSort'(您是否缺少using指令或程序集引用?)C:\Users\Pulkit\Documents\Visual Studio 11\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs 11 26 ConsoleApplication4”和类似错误。我已经引用了所有Dll,并将它们粘贴到bin和bin/Debug目录中。请直接告诉我。这些示例是针对Z34.0的,它们基于新的.NETAPI。您使用的是哪个版本?下面是新API的文档:我尝试添加对z3-3.2和z3-4.0的引用。没有一个有效!!仍然感谢您的帮助>您能编译Z34.0附带的C#示例吗?您是否尝试使用Visual Studio命令提示符?要编译使用Z3的文件tst.cs
,我使用以下命令行:csc/reference:[Z3_PATH]\bin\microsoft.Z3.dll/out:tst.exe tst.cs
否它也不会在命令提示符下编译,并给出相同的错误!!我确实包括了Microsoft.z3.dll作为参考