Definition acquire_spec := DECLARE _acquire acquire_spec.Definition release_spec := DECLARE _release release_spec.Definition makelock_spec := DECLARE _makelock (makelock_spec _).Notation "'WITH'  x1 : t1 , x2 : t2 , x3 : t3 , x4 : t4 , x5 : t5 , x6 : t6 , x7 : t7 , x8 : t8 , x9 : t9 , x10 : t10 , x11 : t11 , x12 : t12 , x13 : t13 , x14 : t14 , x15 : t15 'PRE'  [ u , .. , v ] P 'POST' [ tz ] Q" :=
     (NDmk_funspec ((cons u%formals .. (cons v%formals nil) ..), tz) cc_default (t1*t2*t3*t4*t5*t6*t7*t8*t9*t10*t11*t12*t13*t14*t15)
           (fun x => match x with (x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15) => P%assert end)
           (fun x => match x with (x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15) => Q%assert end))
            (at level 200, x1 at level 0, x2 at level 0, x3 at level 0, x4 at level 0,
             x5 at level 0, x6 at level 0, x7 at level 0, x8 at level 0, x9 at level 0,
              x10 at level 0, x11 at level 0, x12 at level 0,  x13 at level 0, x14 at level 0,
               x15 at level 0,
             P at level 100, Q at level 100).Record node_rep := { data : Z; next : val; lock : val; gnext : val }.Record node_rep := { data : Z; next : val; lock : val; gnext : val }.Record node_rep := { data : Z; next : val; lock : val; gnext : val }.Record node_rep := { data : Z; next : val; lock : val; gnext : val }.Record node_rep := { data : Z; next : val; lock : val; gnext : val }.Definition known_nodes gsh1 gsh2 nodes :=
  fold_right sepcon emp (map (fun '(p, rep) => node' gsh1 gsh2 rep p) nodes).Definition tnode_pair := Tstruct _node_pair noattr.

(* Specifications: *)
Lemma node_lock_inv_positive : forall gsh2 g, positive_mpred (EX p : val, ghost_var gsh2 p g).
Lemma body_new_node : semax_body Vprog Gprog f_new_node new_node_spec.
Lemma node_data_share_join : forall gsh1 gsh2 sh1 sh2 sh rep p, readable_share sh1 -> readable_share sh2 -> sepalg.join sh1 sh2 sh -> node_data gsh1 gsh2 sh1 rep p * node_data gsh1 gsh2 sh2 rep p = node_data gsh1 gsh2 sh rep p.
Lemma known_nodes_cons : forall gsh1 gsh2 rep p nodes, known_nodes gsh1 gsh2 ((p, rep) :: nodes) = node' gsh1 gsh2 rep p * known_nodes gsh1 gsh2 nodes.
Lemma known_nodes_join : forall gsh1 gsh2 nodes1 nodes2, known_nodes gsh1 gsh2 nodes1 * known_nodes gsh1 gsh2 nodes2 = known_nodes gsh1 gsh2 (nodes1 ++ nodes2).