A4Soln
Prolog Solutions
Note that these solutions will not be covered on the final exam.
Puzzle 1
students([fariba, qin, mary, paul]).
better_result(X, Y, [X, Y, _, _]).
better_result(X, Y, [X, _, Y, _]).
better_result(X, Y, [X, _, _, Y]).
better_result(X, Y, [_, X, Y, _]).
better_result(X, Y, [_, X, _, Y]).
better_result(X, Y, [_, _, X, Y]).
first([X, _, _, _], X).
third([_, _, X, _], X).
race_results(BikeResults, SwimResults) :-
students(S),
permutation(S, BikeResults),
permutation(S, SwimResults),
better_result(_, fariba, SwimResults),
better_result(_, fariba, BikeResults),
better_result(fariba, mary, SwimResults),
better_result(mary, fariba, BikeResults),
first(SwimResults, X),
third(BikeResults, X),
better_result(fariba, mary, SwimResults),
better_result(mary, fariba, BikeResults),
better_result(mary, _, SwimResults),
better_result(mary, _, BikeResults),
first(BikeResults, paul),
better_result(qin, paul, SwimResults).
Using SWI-prolog:
?- race_results(Bike, Swim). Bike = [paul, mary, qin, fariba], Swim = [qin, fariba, mary, paul] .
Puzzle 2
lunch_items(fruit, [apple, orange, banana, grapes]).
lunch_items(sandwich, [bologna, turkey, ham_cheese, peanut_butter]).
lunch_items(dessert, [brownie, cupcake, cookie, candy_bar]).
children([may, faye, jay, ray]).
solution_structure([ate(may, brought(F1child, F1), brought(S1child, S1), brought(D1child, D1)),
ate(faye, brought(F2child, F2), brought(S2child, S2), brought(D2child, D2)),
ate(jay, brought(F3child, F3), brought(S3child, S3), brought(D3child, D3)),
ate(ray, brought(F4child, F4), brought(S4child, S4), brought(D4child, D4))]) :-
lunch_items(fruit, F),
permutation(F, [F1, F2, F3, F4]),
lunch_items(sandwich, S),
permutation(S, [S1, S2, S3, S4]),
lunch_items(dessert, D),
permutation(D, [D1, D2, D3, D4]),
permutation([faye, jay, ray], [F1child, S1child, D1child]),
permutation([may, jay, ray], [F2child, S2child, D2child]),
permutation([may, faye, ray], [F3child, S3child, D3child]),
permutation([may, faye, jay], [F4child, S4child, D4child]),
children(C),
permutation(C, [F1child, F2child, F3child, F4child]),
permutation(C, [S1child, S2child, S3child, S4child]),
permutation(C, [D1child, D2child, D3child, D4child]).
swapped_like_items([A1, A2, A3, A4]) :-
swapped_like_items2(A1, [A2, A3, A4]),
swapped_like_items2(A2, [A1, A3, A4]),
swapped_like_items2(A3, [A1, A2, A4]),
swapped_like_items2(A4, [A1, A2, A3]).
swapped_like_items2(ate(C0, brought(C1, _), brought(C2, _), brought(C3, _)), Others) :-
member(ate(C1, brought(C0, _), _, _), Others),
member(ate(C2, _, brought(C0, _), _), Others),
member(ate(C3, _, _, brought(C0, _)), Others).
% The child who ate the apple also gobbled up the chocolate cupcake.
rule1(Eaten) :-
member(ate(_, brought(_, apple), _, brought(_, cupcake)), Eaten).
% Jay traded his fruit for Ray's orange.
rule2(Eaten) :-
member(ate(jay, brought(ray, orange), _, _), Eaten).
% One child brought a bologna sandwich and a banana to school.
rule3(Eaten) :-
member(ate(_, _, brought(C, bologna), _), Eaten),
member(ate(_, brought(C, banana), _, _), Eaten).
% The child who ate the turkey sandwich also ate the grapes.
rule4(Eaten) :-
member(ate(_, brought(_, grapes), brought(_, turkey), _), Eaten).
% The child who ate the ham cheese sandwich traded away the cookie Mom had packed.
rule5(Eaten) :-
member(ate(C, _, brought(_, ham_cheese), _), Eaten),
member(ate(_, _, _, brought(C, cookie)), Eaten).
% Ray enjoyed Faye's peanut butter sandwich.
rule6(Eaten) :-
member(ate(ray, _, brought(faye, peanut_butter), _), Eaten).
% The child who ate Jay's sandwich also ate the candy bar.
rule7(Eaten) :-
member(ate(_, _, brought(jay, _), brought(_, candy_bar)), Eaten).
eaten(X) :-
solution_structure(X),
rule1(X),
rule2(X),
rule3(X),
rule4(X),
rule5(X),
rule6(X),
rule7(X),
swapped_like_items(X).
Using SWI-prolog:
?- eaten(X).
X = [ate(may, brought(faye, grapes), brought(jay, turkey), brought(ray, candy_bar)),
ate(faye, brought(may, banana), brought(ray, ham_cheese), brought(jay, brownie)),
ate(jay, brought(ray, orange), brought(may, bologna), brought(faye, cookie)),
ate(ray, brought(jay, apple), brought(faye, peanut_butter), brought(may, cupcake))] .
Puzzle 3
woman(emily).
woman(hannah).
woman(iris).
man(gregory).
man(donald).
surnames([didduck, lombardi, purpuri, swaboda, wong]).
surname(X) :- surnames(S), member(X, S).
subjects([sunset, tugboat, horse, shrub, lighthouse]).
subject(X) :- subjects(S), member(X, S).
solution_structure([photographer(emily, EmilySurname, EmilySubject),
photographer(hannah, HannahSurname, HannahSubject),
photographer(iris, IrisSurname, IrisSubject),
photographer(donald, DonaldSurname, DonaldSubject),
photographer(gregory, GregorySurname, GregorySubject)]) :-
surnames(S),
permutation(S, [EmilySurname, HannahSurname, IrisSurname, DonaldSurname, GregorySurname]),
subjects(T),
permutation(T, [EmilySubject, HannahSubject, IrisSubject, DonaldSubject, GregorySubject]).
% The one surnamed Didduck (who isn't Iris) photographed a tugboat.
rule1(Photographers) :-
member(photographer(X, didduck, tugboat), Photographers),
member(X, [emily, hannah, donald, gregory]).
% One woman (who isn't surnamed Purpuri) took a photograph of a breathtaking sunset.
rule2(Photographers) :-
member(photographer(X, Y, sunset), Photographers),
woman(X),
surname(Y),
Y \== purpuri.
% The one surnamed Lombardi (who isn't Hannah or Iris) used a fast shutter speed to capture a shot of a young horse at play.
rule3(Photographers) :-
member(photographer(X, lombardi, horse), Photographers),
X \== hannah,
X \== iris.
% Gregory Swaboda took his photo with the camera he received for his birthday.
rule4(Photographers) :-
member(photographer(gregory, swaboda, _), Photographers).
% Neither Iris (who didn't take the picture of the flowering shrub) nor Hannah took a photograph of the sunset.
rule5(Photographers) :-
member(photographer(iris, _, X), Photographers),
X \== shrub,
member(photographer(Y, _, sunset), Photographers),
Y \== iris,
Y \== hannah.
photographers(X) :-
solution_structure(X), rule1(X), rule2(X), rule3(X), rule4(X), rule5(X).
Using SWI-prolog:
?- photographers(X).
X = [photographer(emily, wong, sunset),
photographer(hannah, didduck, tugboat),
photographer(iris, purpuri, lighthouse),
photographer(donald, lombardi, horse),
photographer(gregory, swaboda, shrub)] .
Updated Thu Dec. 06 2018, 15:05 by cameron.