有没有比生成Rust程序的预处理器更好的方法来实现约束满足解算器?

有没有比生成Rust程序的预处理器更好的方法来实现约束满足解算器?,rust,self-modifying,constraint-satisfaction,Rust,Self Modifying,Constraint Satisfaction,我正在编写一个约束满足解算器,它将读取具有多个函数的输入文件,例如 和(不等于(X0,X1),不等于(绝对(减去(X2,X3)),X4)) 求解器将在上述函数上尝试100到100000000秒的X1、X2、X3、X4、X5组合 当前,解算器: 从Vec读取函数的下一条指令 模式将该指令与操作相匹配 执行指令并保存结果,以便稍后在函数中使用 相反,我希望对函数进行预处理,并将它们转换为静态代码。因此,上述功能将变为: fn func_1 (vars: &Vec<i32>) -

我正在编写一个约束满足解算器,它将读取具有多个函数的输入文件,例如

和(不等于(X0,X1),不等于(绝对(减去(X2,X3)),X4))
求解器将在上述函数上尝试100到100000000秒的
X1、X2、X3、X4、X5
组合

当前,解算器:

  • Vec
    读取函数的下一条指令
  • 模式将该指令与操作相匹配
  • 执行指令并保存结果,以便稍后在函数中使用
  • 相反,我希望对函数进行预处理,并将它们转换为静态代码。因此,上述功能将变为:

    fn func_1 (vars: &Vec<i32>) -> bool {
        let t1 = if vars[0] != vars[1] {1} else {0};
        let t2 = vars[2] - vars[3];
        t2.abs();
        let t3 = if t2 != vars[4] {1} else {0};
        if t1 == 1 && t3 == 1 {return true} else {return false}
    }
    
    fn func_1(变量:&Vec)->bool{
    设t1=if-vars[0]!=vars[1]{1}else{0};
    设t2=vars[2]-vars[3];
    t2.abs();
    设t3=if t2!=vars[4]{1}else{0};
    如果t1==1&&t3==1{return true}否则{return false}
    }
    
    我计划有一个预处理器程序:

  • 读取输入文件
  • 自动生成一个模块,将所有功能转换为Rust
  • 编辑解算器的模块,使其使用新生成的函数
  • 调用编译器
  • 运行新编译的解算器
  • 有更好的方法吗


    我可以编写一个单独的程序来编辑自己,在自己身上调用编译器,并安排自己在编译完成后运行吗?

    听起来像是在尝试编写编译器。:-)你认为将两个独立的程序塞进一个源文件会有什么好处?@Shepmaster认为,如果程序紧密耦合,文件管理会更容易。我还想确保我没有错过一个更简单的解决方案。你为什么要写这个而不是使用像Z3这样的SMT解决方案?你想做的事情很可能无法用SMT表达出来,但我会先看一看,然后再开始类似的项目。@KyleJones主要是为了好玩和体验。这实际上是我写的第二个解算器。我想修复我在第一个解算器中早期犯下的几个设计错误。听起来你好像在试图编写编译器。:-)你认为将两个独立的程序塞进一个源文件会有什么好处?@Shepmaster认为,如果程序紧密耦合,文件管理会更容易。我还想确保我没有错过一个更简单的解决方案。你为什么要写这个而不是使用像Z3这样的SMT解决方案?你想做的事情很可能无法用SMT表达出来,但我会先看一看,然后再开始类似的项目。@KyleJones主要是为了好玩和体验。这实际上是我写的第二个解算器。我想修复我在第一个解算器早期犯的几个设计错误。