let test env c goals_t goals_f =
let test pt pf () = W.test env c pt pf in
let rec merge lt lf = match lt, lf with
| [], [] -> []
| g::lt, [] ->
let dsource = [g.g_descr] in
let g = make_goal g.g_id (test g.g_prop W.empty) dsource in
g::(merge lt lf)
| [], g::lf ->
let dsource = [g.g_descr] in
let g = make_goal g.g_id (test W.empty g.g_prop) dsource in
g::(merge lt lf)
| gt::tlt, gf::tlf ->
let cmp = WpPropId.compare_prop_id gt.g_id gf.g_id in
if cmp < 0 then
let dsource = [gt.g_descr] in
let g = make_goal gt.g_id (test gt.g_prop W.empty) dsource in
g::(merge tlt lf)
else if cmp > 0 then
let dsource = [gf.g_descr] in
let g = make_goal gf.g_id (test W.empty gf.g_prop) dsource in
g::(merge lt tlf)
else
let dsource = [gt.g_descr; gf.g_descr] in
let g = make_goal gf.g_id (test gt.g_prop gf.g_prop) dsource in
g::(merge tlt tlf)
in merge goals_t goals_f