let range_subset p q =
    match p , q with
      | _ , Block -> F.p_true
      | Block , _ -> F.p_false
      | Index k1 , Index k2 -> F.p_icmp Ceq k1 k2
      | Index k1 , Range(k2,n2) -> 
          F.p_and 
            (F.p_icmp Cleq k2 k1)
            (F.p_icmp Clt k2 (F.e_iop Iadd k2 n2))
      | Range(k1,n1) , Index k2 ->
          F.p_and
            (F.p_icmp Cleq k2 k1)
            (F.p_icmp Ceq n1 (F.e_int 1))
      | Range(k1,n1) , Range(k2,n2) ->
          F.p_and
            (F.p_icmp Cleq k2 k1)
            (F.p_icmp Cleq (F.e_iop Iadd k1 n1) (F.e_iop Iadd k2 n2))