define product = proc (m n) (productFork m n newref(1) newref(1) newref(false) newref(false)) define productFork = proc (m n refProduct1 refProduct2 refDone1 refDone2) begin choose((productLoop m (avg m n) refProduct1 refDone1), (productLoop (avg m n) n refProduct2 refDone2)); (productJoin refProduct1 refProduct2 refDone1 refDone2) end define productJoin = proc (refProduct1 refProduct2 refDone1 refDone2) if deref(refDone1) then if deref(refDone2) then begin *(deref(refProduct1), deref(refProduct2)) end else begin fail; (productJoin refProduct1 refProduct2 refDone1 refDone2) end else (productJoin refProduct1 refProduct2 refDone1 refDone2) define productLoop = proc (m n refProduct refDone) if <(m,n) then begin setref(refProduct, *(m,deref(refProduct))); (productLoop +(m,1) n refProduct refDone) end else setref(refDone,true) define avg = proc (m n) /(+(m,n),2) (product 1 21)