Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 中原始表达式和结果表达式之间的不一致_Ocaml_Polyhedra - Fatal编程技术网

Ocaml 中原始表达式和结果表达式之间的不一致

Ocaml 中原始表达式和结果表达式之间的不一致,ocaml,polyhedra,Ocaml,Polyhedra,我正在使用库的OCaml接口 当我想减少表达式[|x+y-2>=0;x+y>-3=0 |]时,选项卡的结果是[|-3+1*x+1*y>=0 |],如何获得原始表达式x+y-3>=0 let _ = let vx = Var.of_string "x" in let vy = Var.of_string "y" in let env = Environment.make [||] [|vx;vy|] in let c = Texpr1.cst

我正在使用库的OCaml接口

当我想减少表达式
[|x+y-2>=0;x+y>-3=0 |]
时,
选项卡的结果是
[|-3+1*x+1*y>=0 |]
,如何获得原始表达式
x+y-3>=0

let _ =
  let vx = Var.of_string "x" in
  let vy = Var.of_string "y" in
  let env = Environment.make [||] [|vx;vy|] in
  let c = Texpr1.cst env (Coeff.s_of_int 2) in
  let c' = Texpr1.cst env (Coeff.s_of_int 3) in
  let vx' =  Texpr1.var env vx in
  let vy' = Texpr1.var env vy in
  let texpr = Texpr1.binop Add vx' vy' Real Near in
  let texpr1 = Texpr1.binop Sub texpr c Real Near in
  let texpr2 = Texpr1.binop Sub texpr c' Real Near in
  (* let sum' = Texpr1.(Binop(Sub,x2,Cst c,Int,Near)) in *)
  Format.printf "env = %a@." (fun x -> Environment.print x) env;
  Format.printf "expr = %a@." (fun x -> Texpr1.print x) texpr;
  let cons1 = Tcons1.make texpr1 Lincons0.SUPEQ in
  let cons2 = Tcons1.make texpr2 Lincons0.SUPEQ in

  let tab = Tcons1.array_make env 2 in
  Tcons1.array_set tab 0 cons1;
  Tcons1.array_set tab 1 cons2;
  let abs = Abstract1.of_tcons_array manpk env tab in
  let tab' = Abstract1.to_tcons_array manpk abs in
  Format.printf "tab = %a@." (fun x -> Tcons1.array_print x) tab;
  Format.printf "tab1 = %a@." (fun x -> Tcons1.array_print x) tab'

在我看来,没有不一致之处,因为表达式
-3+1*x+1*y>=0
x+y-3>=0
在语义上是等价的

为什么用这种方式表达? 您正在构建一个多面体(我猜
manpk
指的是波尔卡管理器),即使它是使用树约束构建的,也会在内部使用线性约束表示。因此,当您将其转换回树约束时,实际上是将
Lincons1.array
转换为
Tcons1.array
,因此表示为单项式之和

如果“获取原点表达式”的意思是,以人性化的方式打印它,我建议您将多面体转换为线性约束数组(使用
转换为_lincons_数组
),然后在线性约束上定义自己的漂亮打印实用程序


或者,您也可以使用这个库,它是我在Paper库周围编写的一个小包装,它提供了
pp_print
函数。在您的特定示例中,使用
linconext.pp_print
,您会得到:
x+y>=3
免责声明,Apronext既不高效,也不可靠,也不可维护,因此我建议您不要广泛使用它,但仅用于理解目的

是否有任何接口可以将
Tcons1.array
转换为
Lincons1.array
,反之亦然?@FrankSheng我不知道,但请注意,如果可以将lincons转换为tcons,则另一种方法需要线性化步骤。