let compare v1 v2 = match v1, v2 with
    | VarT _, VarL _ -> 1
    | VarL _, VarT _ -> -1
    | VarT (v1, id1, _,_), VarT (v2, id2, _,_) ->
      let cmp = String.compare v1 v2 in
      if cmp <> 0 then cmp
      else
        begin
          match id1 , id2 with
            | None , None -> 0
            | Some _ , None -> 1
            | None , Some _ -> (-1)
            | Some id1 , Some id2 -> Pervasives.compare id1 id2
        end
    | VarL (v1, _), VarL (v2, _) -> Logic_var.compare v1 v2