Sml 标准ML中命题逻辑公式的大小

Sml 标准ML中命题逻辑公式的大小,sml,ml,mosml,Sml,Ml,Mosml,我正在研究这个问题,命题逻辑公式表示为: datatype fmla = F_Var of string | F_Not of fmla | F_And of fmla * fmla | F_Or of fmla * fmla 我试图写一个函数,返回命题逻辑公式的大小。命题变量的大小为1;逻辑否定的大小为1加上其子公式的大小;逻辑合取和析取的大小为1加上其子公式的大小 我该如何着手解决这个问题呢 一般来说,当您有这样一个sum类型时,最好从一个函数定义开始,该函数

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

datatype fmla =
     F_Var of string
   | F_Not of fmla
   | F_And of fmla * fmla
   | F_Or of fmla * fmla 
我试图写一个函数,返回命题逻辑公式的大小。命题变量的大小为1;逻辑否定的大小为1加上其子公式的大小;逻辑合取和析取的大小为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加上其子公式的大小之和。 您几乎可以将其直接转换为ML:

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_而不是F中写下变量列表,依此类推,然后需要一个合并两个列表的函数,这样结果就不会有重复项,您可以使用它来代替追加。您可能在前面的练习中看到过类似的情况。