【问题标题】:How can I parse a basic Discrete Mathematical statement in Java?如何解析 Java 中的基本离散数学语句?
【发布时间】:2012-08-26 21:35:10
【问题描述】:

我想制作一个Java程序来帮助人们学习基本的离散数学(也就是说,检查语句的真值)。为此,我需要能够检测用户输入了多少变量、有哪些运算符以及有哪些量词(如果有的话)(∃ 和 ∀)。 是否有一个很好的算法可以完成所有这些事情?

你知道,我不只是想要一个结果;我想完全控制他们的输入,这样我就可以向他们展示合乎逻辑的证据。 (所以像将它传递给 JavaScript 这样的操作是行不通的)。

【问题讨论】:

  • 你要找的不是算法,而是语法。之后,您使用语法生成带有 jyacc 或类似的解析器。我会用谷歌搜索语法或在 math.stackexchange.com 中询问
  • 你基本上是在寻找一个简化的计算机代数系统的特征。正如@SJuan76 所说,解决方案将取决于您的语法。
  • 别忘了哥德尔定理! :-P
  • 查看Wolfram Alpha - 他们确实花了数百万行代码来实现您想要的......
  • 我的祖母不太可能将一阶逻辑方程输入到 Java 程序中......

标签: java regex algorithm parsing discrete-mathematics


【解决方案1】:

好的,所以,你的问题有点含糊,但我想我明白你想做什么:一个处理一阶逻辑公式的教育辅助工具,逐步向用户展示如何使用这些公式, 对?我认为这个想法很有价值,而且完全可行,即使是一个人的项目,但这并不容易,你必须学习很多新东西——但它们都是非常有趣的东西,所以即使没有任何结果,您也肯定会获得一些有价值的知识。

我建议你从小处着手。我将首先构建一个recursive descent parser识别零阶逻辑公式(一台可以决定公式是否有效的机器,即它会接受“A ^ B”但它会拒绝“^ A ^”)。接下来你必须设计a way to store the formula,然后你就可以实际工作了。话又说回来,从小处着手:一台接受像TRUE AND NOT (TRUE AND FALSE) 这样的有效零阶逻辑公式并成功将其逐步简化为真的小机器已经是人们可以学习的东西,而且写起来也不是太难。如果您喜欢冒险,请添加变量并制作方程式:A AND TRUE = TRUE - 使用归约和真值表很容易解决这些问题。

使用绑定变量的量词会变得很棘手,这就是Automated theorem proving 可能发挥作用的地方;但是,这完全取决于您想要做什么:将转换实现为各种范式,并逐步向学生展示该过程会相当容易,而且相当有用。

无论如何,我认为这是一个不错的个人项目,你可以从中学到很多东西。如果你在大学里,你甚至可以最终获得一些学分。

【讨论】:

    【解决方案2】:

    我使用的技术是使用上下文无关语法来解析输入字符串。有很多框架可以帮助您做到这一点,我个人过去曾使用ANTLR 将输入字符串解析为离散逻辑树。 ANTLR 允许您定义一个可以映射到 Java 类型的 CFG。这允许您映射到数据结构以存储和评估表达式的真值。当然,你也可以拉出数据结构中包含的变量。

    【讨论】:

    • 我希望避免外部依赖,例如库,因为当我尝试对此进行版权保护时,这可能会导致恶作剧。
    • 如果 ANTLR 不适用于您的许可证,我建议您至少研究一下上下文无关语法......也许编写您自己的解析器或找到一个适用于您的版权的解析器。
    • @Supuhstar, antlr.org/license.html 它是 BSD,这意味着你可以用它做任何你想做的事情,卖掉它,无论什么,只要你在你的文档或类似的地方包含一个注释。但如果语言不太复杂,我只会使用正则表达式。
    • Arecursive descent parser 应该足以应付一阶逻辑,如果您之前没有正式语言或句法和语义分析方面的经验,手写是一个非常好的学习体验。
    • @Supuhstar:一阶逻辑方程的“确定真实状态”可能不仅仅是解析。你可能实际上也需要一个定理证明器。它们更难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多