Functional programming SML中的命题逻辑赋值

Functional programming SML中的命题逻辑赋值,functional-programming,logic,sml,ml,Functional Programming,Logic,Sml,Ml,我试图用SML结构定义一个命题逻辑赋值。命题逻辑中的赋值将命名变量(即字符串)映射为布尔值 这是我的签名: signature VALUATION = sig type T val empty: T val set: T -> string -> bool -> T val value_of: T -> string -> bool val variables: T -> string list val pri

我试图用SML结构定义一个命题逻辑赋值。命题逻辑中的赋值将命名变量(即字符串)映射为布尔值

这是我的签名:

signature VALUATION =
sig
    type T
    val empty: T
    val set: T -> string -> bool -> T
    val value_of: T -> string -> bool
    val variables:  T -> string list
    val print: T -> unit
end;
然后我定义了一个匹配的结构:

structure Valuation :> VALUATION =
        struct
            type T = (string * bool) list
            val empty = []
            fun set  C a b = (a, b) :: C
            fun value_of [] x = false
                | value_of ((a,b)::d) x = if x = a then b else value_of d x  
            fun variables [] = []
                | variables ((a,b)::d) =  a::(variables d ) 
            fun print valuation = 
                (
                    List.app
                        (fn name => TextIO.print (name ^ " = " ^ Bool.toString (value_of valuation name) ^ "\n"))
                        (variables valuation);
                    TextIO.print "\n"
                )
        end;
因此,估值应该看起来像
[(“s”,true),(“c”,false),(“a”,false)]

但我不能像结构评估那样声明,也不能像这样做指令:
[(“s”,true)]:valuation.t当我尝试在函数中使用赋值时,会出现如下错误:

Can't unify (string * bool) list (*In Basis*) with
      Valuation.T

有人能帮我吗?谢谢。

类型
Valuation.T
不透明(隐藏)。
你所知道的就是它叫“T”。
除了通过
估价
签名之外,你不能对它做任何事情,而该签名没有提及列表

只能使用构造函数
empty
set
构建
估价
,并且必须从
empty
开始

- val e = Valuation.empty;
val e = - : Valuation.T
- val v = Valuation.set e "x" true;
val v = - : Valuation.T
- val v2 = Valuation.set v "y" false;
val v2 = - : Valuation.T
- Valuation.value_of v2 "x";
val it = true : bool
- Valuation.variables v2;
val it = ["y","x"] : string list
- Valuation.print v2;
y = false
x = true

val it = () : unit
请注意,每个
Valuation.T
值都打印为“-”,因为内部表示没有公开。

非常感谢!;)。我实际上是通过一个函数实现的,该函数从(string*bool)列表创建一个赋值,从valuation.empty开始,正如您所说。