:- use_module(library(dcg/basics)). :- use_module(library(clpfd)). answers([], []). answers(Group, [Answer|Answers]) :- append(Answer, [10 | Rest], Group), answers(Rest, Answers). answers(Group, [Answer]) :- append(Answer, [10], Group). answers(Group, [Group]). groups(Str, [Answers | Groups]) :- append(Group, [10, 10 | Rest], Str), answers(Group, Answers), groups(Rest, Groups). groups(Str, [Answer]) :- answers(Str, Answer). unique_1(Answers, Count) :- [A| As] = Answers, foldl(union, As, A, Unique), length(Unique, Count). unique_2(Answers, Count) :- [A| As] = Answers, foldl(intersection, As, A, Unique), length(Unique, Count). main(Part1, Part2) :- read_file_to_codes('advent_6_inp.txt', Codes, []), groups(Codes, Groups), maplist(unique_1, Groups, Count1), sum(Count1, #=, Part1), maplist(unique_2, Groups, Count2), sum(Count2, #=, Part2), !.