我必须写一个函数
match_sequent
有4个参数:
form list option
并返回可选的substΓ和Var。
列表我们有一些已定义的类型:
type unop = Neg
type binop = Conj | Disj | Impl | Equiv
type form =
Const of bool
| Var of string
| Unop of unop * form
| Binop of binop * form * form
type sequent = Seq of form list * form
我编写了一个匹配两个表单的函数match_form
,并计算了一个subst(如果存在)。
let rec match_form = function
((Const c1,Const c2)::e,sbst)->
if c1=c2 then match_form(e,sbst)
.....
.....
.....
let form1 = Binop(Conj,Var "a",Var "b");; (* a/\b *)
let form2 = Binop(Conj, Binop(Disj, Const true, Const false), Const true);; (* ((p\/q)/\r) *)
(* Test match_form *)
match_form([(form1, form2)],[]);;
(* Output
- : (string * form) list =
[("a", Binop (Disj, Const true, Const false)); ("b", Const true)]
*)
但实际上我正在努力使用这个函数match_sequent
。
我尝试处理它,但我不知道如何做到这一点。
let rec match_sequent (s1 : sequent) (s2 : sequent) ?sopt svar =
match s1,s2 with
|.....;;
感谢您的帮助
答案 0 :(得分:0)
如果我的理解是正确的,你希望统一两个后续的微积分公式,每个微积分公式都由一阶逻辑公式组成,你已经有了统一算法。
从这个前提来看,实现算法相对简单:回想一下,后续公式是一个公式,其左侧是"左侧"表示为元组的一阶逻辑公式(或表示它们的表单)的结合(∧运算符是隐式的),右侧,在您的情况下,是单个表单(尽管它可能理论上是公式的分离)。因此,统一只是将每对相应的形式统一起来。
let match_sequent s1 s2 ?sopt svar =
match s1, s2 with
Seq (lhs1,rhs1), Seq(lhs2,rhs2) ->
List.fold_left2 (fun l f1 f2 -> match_form (f1,f2)::l) [] (rhs1::lhs1) (rhs2::lhs2)
我的猜测"关于svar
和/或sopt
,您需要检查现有的替换是否与统一找到的替换不相容:需要比较后者和前者,以及匹配变量名,验证他们的替换是等于还是一个比另一个更通用,并保持较不通用的。
另请注意,上述算法期望lhs表单具有完全相同的形状,因此如果lhs1
只是 a ,则它不会与lhs2
的<{1}}统一em> b,c 虽然 b,c 字面意思是b∧c,并且会在一阶逻辑中与 a 统一。如果你的算法要求这种统一是可以接受的,我建议通过将lhs形式组合成一个单独的形式来明确连接,然后对它们应用match_form
统一。
let match_sequent (Seq (lhs1,rhs1)) (Seq (lhs2,rhs2)) ?opt svar =
match lhs1,lhs2 with
f1::lhs1, f2::lhs2 ->
(match_form (List.fold_left conj f1 lhs1) (List.fold_left conj f2 lhs2)) @ (match_form rhs1 rhs2)
| [], lhs
| lhs, [] -> (* empty premises for at least one of the sequent *)
match_form rhs1 rhs2
其中conj
是构成公式的连接的函数:
val conj: form -> form -> form
同样,最后的参数需要以某种方式集成到算法中。
我想指出的最后一个考虑因素是a∧b∧c可以用两种不同的方式编写,具体取决于∧运算符的应用顺序在那里。我想,您的match_form
函数或conj
伪构造函数负责将公式重新平衡为&#34;普通形式&#34;。