%% types([weetbix,milk],[[weetbix,breakfast],[milk,breakfast],[apple,lunch],[weetbix,snack],[milk,snack]],Objects). Objects = [breakfast,snack] types(Types,Pairs,Objects) :- types(Types,Pairs,[],Objects1), Objects1=[Objects|Objects2], same(Objects,Objects2). types([],_Pairs,Objects,Objects). types([Type|Types],Pairs,Objects1,Objects2) :- types1(Type,Pairs,[],Objects3), append(Objects1,[Objects3],Objects4), types(Types,Pairs,Objects4,Objects2). types1(_Type,[],Objects,Objects). types1(Type,[Pair|Pairs],Objects1,Objects2) :- Pair=[Type,Object], append(Objects1,[Object],Objects3), types1(Type,Pairs,Objects3,Objects2),!. types1(Type,[_Pair|Pairs],Objects1,Objects2) :- types1(Type,Pairs,Objects1,Objects2). same(_Objects2,[]). same(Objects,[Objects|Objects2]) :- same(Objects,Objects2).