【问题标题】:Size of propositional-logic formula in Standard ML标准 ML 中命题逻辑公式的大小
【发布时间】:2018-08-16 09:48:25
【问题描述】:

我正在研究这个问题,其中命题逻辑公式表示为:

datatype fmla =
     F_Var of string
   | F_Not of fmla
   | F_And of fmla * fmla
   | F_Or of fmla * fmla 

我正在尝试编写一个返回命题逻辑公式大小的函数。命题变量的大小为 1;逻辑否定的大小为 1 加上其子公式的大小;逻辑合取和析取的大小为 1 加上它们的子公式的大小。

我将如何尝试解决这个问题?

【问题讨论】:

    标签: sml ml mosml


    【解决方案1】:

    一般来说,当您有这样的 sum 类型时,最好从只列出每个案例但忽略实现的函数定义开始:

    fun size (F_Var v) =
      | size (F_Not f) =        
      | size (F_And (f1, f2)) =
      | size (F_Or (f1, f2)) =
    

    然后在你弄清楚案例时一次填写一个案例的定义。

    因为您已经有了每种情况下大小的列表;

    • 命题变量的大小为 1。
    • 否定的大小为 1 加上其子公式的大小。
    • 连词的大小为 1 加上其子公式大小的总和。
    • 析取的大小为 1 加上其子公式大小的总和。

    您几乎可以将其直接翻译成机器学习:

    fun size (F_Var _) = 1
      | size (F_Not f) = 1 + size f
      | size (F_And (f1, f2)) = ...
      | size (F_Or (f1, f2)) = ...
    

    我留下了两个案例供您填写。
    请注意,每个案例的英文定义和ML中的定义都有非常密切的对应关系。

    【讨论】:

    • 谢谢我能从中得到尺寸!我在这个问题的后续问题上遇到了一个问题。它是一个返回函数中所有变量列表的函数。例如:[a,b,c,e]。我对如何为该函数创建一个列表感到困惑,因为没有给出一个列表,以及如何防止重复进入。
    • @MasterYork42 遵循相同的方法:先写下F_Var v 中的变量列表,然后写下F_Not f,依此类推 然后你需要一个合并两个列表的函数,这样结果就不会'没有可以使用而不是附加的重复项。 (你可能在之前的练习中看到过类似的东西。)
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2012-04-09
    • 2021-12-17
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多