我在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);;
答案 0 :(得分:0)
while
循环属于OCaml中的命令式编程部分。
基本上,您无法在while
或for
循环或任何地方修改不可变变量。
要让变量变为可变,您需要将其定义为let var = ref ...
。 ref
是mutables的关键字。
阅读以下两章:
您可以将x,vn,v
定义为ref
,但我想这会很难看。
我建议你以实用的方式思考你的代码。
由于您未在此处放置函数ens
等,因此无法为您生成示例细化。