在OCaml中处理循环内部的不可变变量

时间:2014-05-01 14:24:38

标签: functional-programming ocaml

我在OCaml中有以下代码。我已经定义了所有necesar函数并逐步测试它们评估应该工作正常但是我没有成功地操作while内部的变量。我怎样才能生成x,vn, v改变它们的值?我想我应该像rec循环一样重写while但是无法弄清楚: 以下是代码的其余部分:http://pastebin.com/Ash3xw6y

Pseudocode: 
  input : f formula
  output: yes if f valid 
           else not
    begin:
        V =set of prop variables
        eliminate from f => and <=>
        while (V is not empty)
           choose x from V
           V =V -{x}
           replace f with f[x->true]&&f[x->false]
            simplify as much as possible f
            if f is evaluated with true then return true 
                 else if (not f) is evaluated true then return false
            end if
           end while
      return false
  end

type bexp = V of 
            | string
            | B of bool
            | Neg of bexp
            | And of bexp * bexp 
            | Or of bexp * bexp
            | Impl of bexp * bexp
            | Eqv of bexp * bexp  

module StringSet=Set.make(String)

let is_valide f=
  let v= stringset_of_list (ens f []) in  (*set of all variables of f *)
  let g= elim f in  (*eliminate => and <=> *)
  let quit_loop=ref false in  
  while not !quit_loop
  do
    let x=StringSet.choose  v in
    let vn=StringSet.remove x v in
    if StringSet.is_empty vn=true then quit_loop:=true;
    let h= And( replace x (B true) g ,replace x (B false) g)in
    let j=simplify h in
    if (only_bools j) then
      if (eval j) then print_string "yes" 
      else print_string "not"
  done

新表格

   let tautology f =
           let rec tautology1 x v g =     
               let h= And( remplace x (B true) g ,remplace x (B false) g)in
               let j= simplify h in
     if not (only_bools j) then tautology (StringSet.choose (StringSet.remove x v)     (StringSet.remove x v)  j 
                 else 
                   if (eval1 j) then print_string "yes \n "  else
                     if (eval1 (Neg (j)))  then  print_string "not \n";
           in tautology1 (StringSet.choose (stringset_of_list (ens f [])) (stringset_of_list (ens f []))  (elim f);;

1 个答案:

答案 0 :(得分:0)

while循环属于OCaml中的命令式编程部分。

基本上,您无法在whilefor循环或任何地方修改不可变变量。

要让变量变为可变,您需要将其定义为let var = ref ...ref是mutables的关键字。

阅读以下两章:

  1. https://realworldocaml.org/v1/en/html/a-guided-tour.html#imperative-programming
  2. https://realworldocaml.org/v1/en/html/imperative-programming-1.html

  3. 您可以将x,vn,v定义为ref,但我想这会很难看。

    我建议你以实用的方式思考你的代码。

    由于您未在此处放置函数ens等,因此无法为您生成示例细化。