/* Venn diagram in Picat. This is a general program for generating Venn diagram for arbitrary number of sets. Here are the solutions for sets of length 1..4 numSets=1 sets=[[1]] size=1 singlePositions=[1] setsAlpha=["A"] Regions: [1] numSets=2 sets=[[1],[1,2],[2]] size=3 singlePositions=[1,3] setsAlpha=["A","AB","B"] Regions: [1,2] [2,3] numSets=3 sets=[[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]] size=7 singlePositions=[1,5,7] setsAlpha=["A","AB","ABC","AC","B","BC","C"] Regions: [1,2,3,4] [2,3,5,6] [3,4,6,7] numSets=4 sets=[[1],[1,2],[1,2,3],[1,2,3,4],[1,2,4],[1,3],[1,3,4],[1,4],[2],[2,3],[2,3,4],[2,4],[3],[3,4],[4]] size=15 singlePositions=[1,9,13,15] setsAlpha=["A","AB","ABC","ABCD","ABD","AC","ACD","AD","B","BC","BCD","BD","C","CD","D"] Regions: [1,2,3,4,5,6,7,8] [2,3,4,5,9,10,11,12] [3,4,6,7,10,11,13,14] [4,5,7,8,11,12,14,15] This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. % import cp. main => go. % sets=[[1],[1,2],[1,2,3],[1,2,3,4],[1,2,4],[1,3],[1,3,4],[1,4],[2],[2,3],[2,3,4],[2,4],[3],[3,4],[4]] % size=15 % singlePositions=[1,9,13,15] % setsAlpha=["A","AB","ABC","ABCD","ABD","AC","ACD","AD","B","BC","BCD","BD","C","CD","D"] % [1,2,3,4,5,6,7,8] % [2,3,4,5,9,10,11,12] % [3,4,6,7,10,11,13,14] go => generate(4), nl. % goal=generate(5) % sets=[[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5],[1,2,3,5],[1,2,4],[1,2,4,5],[1,2,5],[1,3],[1,3,4],[1,3,4,5],[1,3,5],[1,4],[1,4,5],[1,5],[2],[2,3],[2,3,4],[2,3,4,5],[2,3,5],[2,4],[2,4,5],[2,5],[3],[3,4],[3,4,5],[3,5],[4],[4,5],[5]] % size=31 % singlePositions=[1,17,25,29,31] % setsAlpha=["A","AB","ABC","ABCD","ABCDE","ABCE","ABD","ABDE","ABE","AC","ACD","ACDE","ACE","AD","ADE","AE","B","BC","BCD","BCDE","BCE","BD","BDE","BE","C","CD","CDE","CE","D","DE","E"] % [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] % [2,3,4,5,6,7,8,9,17,18,19,20,21,22,23,24] % [3,4,5,6,10,11,12,13,18,19,20,21,25,26,27,28] % [4,5,7,8,11,12,14,15,19,20,22,23,26,27,29,30] % [5,6,8,9,12,13,15,16,20,21,23,24,27,28,30,31] go2 => generate(5), nl. go3 => foreach(NumSets in 1..10) generate(NumSets) end, nl. generate(NumSets) => println(numSets=NumSets), Alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", Sets = (1..NumSets).power_set().sort().delete([]), println(sets=Sets), Len = Sets.length, println(size=Len), % The position of the single integers (for symmetry breaking) println(singlePositions=[Pos : Pos in 1..Len, Sets[Pos].length == 1]), SetsAlpha = [ [Alpha[I] : I in S] : S in Sets], println(setsAlpha=[ "\"" ++ A.to_string() ++ "\"" : A in SetsAlpha]), % collect the "master regions" which all contains the specific % 1..NumSets integers println("Regions:"), T2 = [ [ S : S in 1..Len, I in Sets[S] ] : I in 1..NumSets], foreach(P in T2) println(P) end, nl.