我想制作一个Java程序来帮助人们学习基本的离散数学(也就是说,检查语句的真值)。为此,我需要能够检测用户输入了多少变量、有哪些运算符以及有哪些量词(如果有的话)(∃ 和 ∀)。有没有一个很好的算法可以做所有这些事情?
只是让你知道,我不只是想要一个结果;我想完全控制他们的输入,这样我就可以向他们展示合乎逻辑的证据。(所以像将它传递给 JavaScript 这样的事情是行不通的)。
我想制作一个Java程序来帮助人们学习基本的离散数学(也就是说,检查语句的真值)。为此,我需要能够检测用户输入了多少变量、有哪些运算符以及有哪些量词(如果有的话)(∃ 和 ∀)。有没有一个很好的算法可以做所有这些事情?
只是让你知道,我不只是想要一个结果;我想完全控制他们的输入,这样我就可以向他们展示合乎逻辑的证据。(所以像将它传递给 JavaScript 这样的事情是行不通的)。
我使用的技术是使用上下文无关语法解析输入字符串。有很多框架可以帮助您做到这一点,我过去曾亲自使用ANTLR将输入字符串解析为离散逻辑树。ANTLR 允许您定义一个可以映射到 Java 类型的 CFG。这允许您映射到数据结构以存储和评估表达式的真值。当然,您也可以提取数据结构中包含的变量。
好的,所以,你的问题有点含糊,但我想我理解你想要做什么:一个处理一阶逻辑公式的教育辅助工具,逐步向用户展示如何使用这些公式,对吧?我认为这个想法很有价值,而且完全可行,即使是一个人的项目,但这并不容易,你必须学习很多新东西——但它们都是非常有趣的东西,所以即使没有任何结果,您也肯定会获得一些有价值的知识。
我建议你从小处着手。我首先构建一个递归下降解析器来识别零阶逻辑公式(一台机器将决定一个公式是否有效,即它会接受“A ^ B”但它会拒绝“^ A ^”) . 接下来,您必须设计一种存储公式的方法,然后您才能实际处理它。TRUE AND NOT (TRUE AND FALSE)
话又说回来,从小做起:一台接受有效零阶逻辑公式(如 如果您喜欢冒险,请添加变量并制作方程式:A AND TRUE = TRUE
-使用归约和真值表很容易解决这些问题。
绑定变量的量词会变得很棘手,这就是自动化定理证明可能发挥作用的地方;但是,这完全取决于您想要做什么:将转换实现为各种范式,并逐步向学生展示该过程将相当容易,而且相当有用。
无论如何,我认为这是一个不错的个人项目,你可以从中学到很多东西。如果你在大学里,你甚至可以最终获得一些学分。