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 =  WpAnnot.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