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.

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.