Ocaml 理解代码背后的语义

Ocaml 理解代码背后的语义,ocaml,coq,Ocaml,Coq,我有一个OCaml代码,我很难将函数mi_pol形式化到Coq中,因为我不清楚该代码到底在做什么,例如在 aux (vec_add add const (vector ci v)) args ps 及 代码如下: let vector = List.map;; let clist x = let rec aux k = if k <= 0 then [] else x :: aux (k-1) in aux;; let vec_add add v1 v2 = try Lis

我有一个OCaml代码,我很难将函数
mi_pol
形式化到Coq中,因为我不清楚该代码到底在做什么,例如在

aux (vec_add add const (vector ci v)) args ps 

代码如下:

let vector = List.map;;

let clist x =
  let rec aux k = if k <= 0 then [] else x :: aux (k-1) in aux;;

let vec_add add v1 v2 =
  try List.map2 add v1 v2
  with Invalid_argument _ ->
    error_fmt "sum of two vectors of different size";;

let mat_add add m1 m2 =
  try List.map2 (vec_add add) m1 m2
  with Invalid_argument _ ->
    error_fmt "sum of two matrices of different size";;

(*vector zero *)
let vec_0 z dim = clist z dim;;  

(* matrix zero *)
let mat_0 z dim = clist (vec_0 z dim) dim;;
let comp f g x = f (g x);;

(* matrix transpose *)
let transpose ci =
  let rec aux = function
    | [] | [] :: _ -> []
    | cs -> List.map (comp ci List.hd) cs :: aux (List.map List.tl cs)
  in aux;;  

(* matrix *)
let matrix ci m =
  try transpose ci m
  with Failure _ -> error_fmt "ill-formed matrix";;

let mi_pol z add ci =
  let rec aux const args = function
    | [] -> { mi_const = const; mi_args = Array.to_list args }
    | Polynomial_sum qs :: ps -> aux const args (qs @ ps)
    | Polynomial_coefficient (Coefficient_matrix [v]) :: ps
    | Polynomial_coefficient (Coefficient_vector v) :: ps ->
      aux (vec_add add const (vector ci v)) args ps
    | Polynomial_product [p] :: ps -> aux const args (p :: ps)
    | Polynomial_product [Polynomial_coefficient (Coefficient_matrix m); 
                          Polynomial_variable i] :: ps ->
      args.(i-1) <- mat_add add args.(i-1) (matrix ci m);
      aux const args ps
    | _ -> not_supported "todo"
  in fun dim n -> function
    | Polynomial_sum ps -> aux (vec_0 z dim) (Array.make n (mat_0 z dim)) ps
    | _ -> not_supported
      "todo";;
let vector=List.map;;
让clist x=
设rec aux k=如果k
错误_fmt“两个大小不同的向量之和”;;
让mat_加上m1和m2=
try List.map2(vec_add)m1 m2
使用无效的参数\uu->
错误_fmt“两个大小不同的矩阵之和”;;
(*向量零*)
设vec_0 z dim=clist z dim;;
(*矩阵零*)
设mat_0 z dim=clist(vec_0 z dim)dim;;
设comp f g x=f(g x);;
(*矩阵转置*)
让我们转置ci=
设rec aux=函数
| [] | [] :: _ -> []
|cs->List.map(comp-ci-List.hd)cs::aux(List.map-List.tl-cs)
在aux中;;
(*矩阵*)
设矩阵cim=
尝试转置cim
故障->错误->格式不正确的矩阵;;
让mi_pol z添加ci=
设rec aux const args=函数
|[]->{mi_const=const;mi_args=Array.to_list args}
|多项式和qs::ps->aux const args(qs@ps)
|多项式系数(系数矩阵[v])::ps
|多项式系数(系数向量v)::ps->
辅助(向量添加常量(向量ci v))参数ps
|多项式乘积[p]::ps->辅助常量参数(p::ps)
|多项式乘积[多项式系数(系数矩阵m);
多项式_变量i]::ps->
args.(i-1)不支持“待办事项”
在fun dim n->函数中
|多项式和ps->aux(vec_0 z dim)(Array.make n(mat_0 z dim))ps
|不支持
“待办事项”;;

非常感谢您的帮助。如果你能为mi_pol提供一个Coq代码,它将对我有很大帮助。

它似乎在向量空间上取一个多项式,并计算每个变量所附加的所有(矩阵转置)系数之和
args
是一个数组,使得
args.(i)
i
-th变量上所有系数的和,
const
是常量标量的和


我不知道这个操作的意义是什么,但我怀疑它在一般情况下意义不大(处理…的乘积和的任意乘积;这将导致奇怪的非线性/齐次行为)。我假设对这种多项式类型的实际值的形状有隐式约束,例如,它在所有变量中可能是线性的。

它似乎在向量空间上取一个多项式,并计算附加到每个变量的所有(矩阵转置)系数之和
args
是一个数组,使得
args.(i)
i
-th变量上所有系数的和,
const
是常量标量的和


我不知道这个操作的意义是什么,但我怀疑它在一般情况下意义不大(处理…的乘积和的任意乘积;这将导致奇怪的非线性/齐次行为)。我想,对于这种多项式类型的实际值的形状有一些隐含的限制,例如,它在所有变量中都可能是线性的。

这个问题问得很糟糕。你承认甚至不理解代码,但你想把它形式化?我认为你是本末倒置。投票支持close是因为“过于本地化”——不太可能帮助任何未来的游客。这个问题问得很糟糕。你承认甚至不理解代码,但你想把它形式化?我认为你是本末倒置。投票支持close是因为“过于本地化”——不太可能帮助未来的游客。
aux (vec_0 z dim) (Array.make n (mat_0 z dim)) ps
let vector = List.map;;

let clist x =
  let rec aux k = if k <= 0 then [] else x :: aux (k-1) in aux;;

let vec_add add v1 v2 =
  try List.map2 add v1 v2
  with Invalid_argument _ ->
    error_fmt "sum of two vectors of different size";;

let mat_add add m1 m2 =
  try List.map2 (vec_add add) m1 m2
  with Invalid_argument _ ->
    error_fmt "sum of two matrices of different size";;

(*vector zero *)
let vec_0 z dim = clist z dim;;  

(* matrix zero *)
let mat_0 z dim = clist (vec_0 z dim) dim;;
let comp f g x = f (g x);;

(* matrix transpose *)
let transpose ci =
  let rec aux = function
    | [] | [] :: _ -> []
    | cs -> List.map (comp ci List.hd) cs :: aux (List.map List.tl cs)
  in aux;;  

(* matrix *)
let matrix ci m =
  try transpose ci m
  with Failure _ -> error_fmt "ill-formed matrix";;

let mi_pol z add ci =
  let rec aux const args = function
    | [] -> { mi_const = const; mi_args = Array.to_list args }
    | Polynomial_sum qs :: ps -> aux const args (qs @ ps)
    | Polynomial_coefficient (Coefficient_matrix [v]) :: ps
    | Polynomial_coefficient (Coefficient_vector v) :: ps ->
      aux (vec_add add const (vector ci v)) args ps
    | Polynomial_product [p] :: ps -> aux const args (p :: ps)
    | Polynomial_product [Polynomial_coefficient (Coefficient_matrix m); 
                          Polynomial_variable i] :: ps ->
      args.(i-1) <- mat_add add args.(i-1) (matrix ci m);
      aux const args ps
    | _ -> not_supported "todo"
  in fun dim n -> function
    | Polynomial_sum ps -> aux (vec_0 z dim) (Array.make n (mat_0 z dim)) ps
    | _ -> not_supported
      "todo";;