:- use_module(library(lists),[member/2, last/2]). threed([View1Slice1,View1Slice2,View1Slice3], [View2Slice1,View2Slice2,View2Slice3],Max) :- threed_slice(View1Slice1,View2Slice1,Max1), threed_slice(View1Slice2,View2Slice2,Max2), threed_slice(View1Slice3,View2Slice3,Max3), Max is Max1 + Max2 + Max3. threed_slice(View1,View2,Max) :- findall(M,consistent_slice(View1,View2,M),Ms), sort(Ms,L), last(L,Max). consistent_slice([Color1,Color2,Color3],[Color4,Color5,Color6],M) :- visible_color([G,D,A],Color1), visible_color([H,E,B],Color2), visible_color([I,F,C],Color3), visible_color([I,H,G],Color4), visible_color([F,E,D],Color5), visible_color([C,B,A],Color6), count_cubes([A,B,C,D,E,F,G,H,I],0,M). visible_color(Cubes,Color) :- ( Color == (*) -> see_through(Cubes) ; first_visible_is(Cubes,Color) ). see_through([]). see_through([color(none)|R]) :- see_through(R). first_visible_is([Color|_],Color). first_visible_is([color(none)|R],Color) :- first_visible_is(R,Color). count_cubes(Cubes,_,N) :- findall(C,(member(C,Cubes), C \== color(none)),Cs), length(Cs,N).