【问题标题】:Conversion to CNF转换为 CNF
【发布时间】:2013-04-12 03:03:45
【问题描述】:

这是一个任务。我必须将一组语句转换为 CNF 并实现它们。我知道我需要先将前缀符号中的输入转换为中缀,然后重复应用德摩根定律。但是,将其转换为中缀表示法后,我不知道如何继续执行。

  1. 我必须将其转换为中缀还是有更好的流程来做到这一点?
  2. 我一直在阅读 Python here 中实现的 BDD。我正在用 Java 编码,我想自己做,而不使用任何外部库。关于实现算法的任何指针?我是否朝着正确的方向将其转换为中缀?

谢谢!

【问题讨论】:

  • 常规 CNF 还是 3-CNF?
  • 只是 CNF。另外,我需要从知识库(输入)执行一阶解析。
  • 输入是什么样的?它是你需要解析的又大又丑的字符串,还是为你预先解析了它?
  • 样本输入:(=> W H) (=> C H) (NOT H) (OR (AND A B) (AND A C)) ( A D) 但其他样本涉及更多变量和许多更多层次的嵌套。

标签: java algorithm cnf


【解决方案1】:

无需将其转换为中缀 - 例如,您希望尽快离开字符串域

public abstract class Expression
public abstract class BinaryExpression extends Expression {
    private Expression expr1;
    private Expression expr2;
    public Expression getExpr1() { return expr1; }
    public void setExpr1(Expression expr) { expr1 = expr; }
}
public abstract class UnaryExpression extends Expression
public class Or extends BinaryExpression
public class Not extends UnaryExpression

等等。要将输入解析为Expressions,您可能会发现使用Recursive Descent Parser 很有用,尽管这肯定不是解析输入的唯一方法。将输入转换为符号 Expression 格式后,应用布尔定律将其转换为 CNF 应该会容易得多。

【讨论】:

  • 好的,这是为了解决 CNF,以便我可以将它用于 FOL,对吧?我想以 CNF 形式显示输入。对不起,如果我没有得到你。
  • 上述输入我应该得到的输出是 (OR (NOT W) H) (OR (NOT C) H) (NOT H) (A) (OR B C) (OR (NOT A ) D) (OR (NOT D) A) RDP, afaik, 只解决它但不允许我在 CNF 中显示它。
  • Expression 类用于将输入转换为 CNF,因为操作符号比操作字符串更容易。对于输出,您将使用类的 toString 方法,例如对于Or 类,toString 方法将是return "(OR" + getExpr1().toString() + " " + getExpr2().toString() + ")"
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多