math-comp / finmap

Finite sets, finite maps, multisets and generic sets
46 stars 28 forks source link

Notation issues for `imfset` #73

Open chdoc opened 4 years ago

chdoc commented 4 years ago

The following script showcases some unfortunate notation behaviors (on the current coq.dev and finmap.dev)

From mathcomp Require Import all_ssreflect finmap.

Open Scope fset_scope.

Lemma fsetIsep (T : choiceType) (A B : {fset T}) : 
  A `&` B = [fset x in A | x \in B].

(* Goal: A `&` B = [fset (x : T) | x in A & x \in B] *)

rewrite /fsetI.

(* Goal: [fset x | x in A & x \in B] = [fset x | x in A & x \in B] *)

Fail reflexivity.

apply/fsetP => x; rewrite !inE.

(* Goal: (x \in A) && (x \in B) = (x \in mem_fin (fset_finpred A)) && (x \in B) *)

rewrite /=.

(* Goal:  (x \in A) && (x \in B) = (x \in [eta mem_seq (T:=T) A]) && (x \in B) *)

reflexivity.

Qed.
CohenCyril commented 4 years ago

This is bad indeed. For one part of my defense (FWIW) you are not supposed to unfold fsetI ;) What happens next with !inE /= is highly embarrassing... I will look into this, thanks for pointing it out.

chdoc commented 4 years ago

For one part of my defense (FWIW) you are not supposed to unfold fsetI ;)

Yes, I realized that. Indeed, unfolding the defined operations can cause even more "funny" behaviors. I you replace & with \, then rewrite !inE /= will rewrite the unfolded [fset x | x in A & x \notin B] to (x \notin B) && (x \in A), presumably because it (still) uses the in_fsetD rule rather than the in_fset rule that one would expect to get from the printed goal. Ineed, rewriting with in_fset !inE /= gives the expected [eta mem_seq ...] mess. :unamused: