SML 中的命题逻辑估值
Propositional Logic Valuation in SML
我正在尝试使用 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".
除非通过 VALUATION
签名,否则您无法对它执行任何操作,并且该签名没有提及列表。
您只能使用构造函数 empty
和 set
构建 Valuation
,并且必须从 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
值都打印为“-”,因为未公开内部表示。
我正在尝试使用 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".
除非通过 VALUATION
签名,否则您无法对它执行任何操作,并且该签名没有提及列表。
您只能使用构造函数 empty
和 set
构建 Valuation
,并且必须从 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
值都打印为“-”,因为未公开内部表示。