(* Copyright (c) 2012-2015, Robbert Krebbers. *)(* This file is distributed under the terms of the BSD license. *)(** This file implements sets as functions into Prop. *)RequireExportprelude.Recordset(A:Type):Type:=mkSet{set_car:A→Prop}.ArgumentsmkSet{_}_.Argumentsset_car{_}__.Definitionset_all{A}:setA:=mkSet(λ_,True).Instanceset_empty{A}:Empty(setA):=mkSet(λ_,False).Instanceset_singleton{A}:SingletonA(setA):=λx,mkSet(x=).Instanceset_elem_of{A}:ElemOfA(setA):=λxX,set_carXx.Instanceset_union{A}:Union(setA):=λX1X2,mkSet(λx,x∈X1∨x∈X2).Instanceset_intersection{A}:Intersection(setA):=λX1X2,mkSet(λx,x∈X1∧x∈X2).Instanceset_difference{A}:Difference(setA):=λX1X2,mkSet(λx,x∈X1∧x∉X2).Instanceset_collection:CollectionA(setA).Proof.bysplit;[split||];repeatintro.Qed.Instanceset_ret:MRetset:=λA(x:A),{[x]}.Instanceset_bind:MBindset:=λAB(f:A→setB)(X:setA),mkSet(λb,∃a,b∈fa∧a∈X).Instanceset_fmap:FMapset:=λAB(f:A→B)(X:setA),mkSet(λb,∃a,b=fa∧a∈X).Instanceset_join:MJoinset:=λA(XX:set(setA)),mkSet(λa,∃X,a∈X∧X∈XX).Instanceset_collection_monad:CollectionMonadset.Proof.bysplit;tryapply_.Qed.GlobalOpaqueset_unionset_intersection.