C# Z3中多值逻辑公式的求值

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的小

我需要使用Z3在各种变量值上计算表达式的值。 我知道Z3是一个可满足性检查器,但model.Eval(Args)会在模型生成的变量值处对表达式进行求值

因此,我们可以迭代各种值来计算表达式

示例:p和q的所有可能值的p和q(p,q为布尔值)

所以在某种意义上,使用递归或迭代从中创建一个真值表。 Z3有没有可能这样做

对C#API的帮助会更好


<>谢谢

你可以考虑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作为参考