ocaml write match sequent function

时间:2015-01-03 17:21:00

标签: ocaml substitution

我必须写一个函数 match_sequent有4个参数:

  1. 第一次后续
  2. 第二次后续
  3. 可选的子Γ,类型为form list option
  4. 列出Var
  5. 的子目录

    并返回可选的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 
    
       |.....;;
    

    感谢您的帮助

1 个答案:

答案 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;。