On Thursday, April 23, 2015 at 6:28:13 AM UTC-4,
neng...@gmail.com wrote:
Joachim Schimpf correctly pointed out a mistake in my original program. Here is a corrected version.
% in Picat, by Neng-Fa Zhou, April 24, 2015
main =>
Table = [(5,15),(5,16),(5,19),(6,17),(6,18),(7,14),(7,16),(8,14),(8,15),(8,17)],
Months = [5,6,7,8],
Days = [14,15,16,17,18,19],
findall(M,clue1(Table,Months,Days,M)) = AlbertMonths, % possible months that were told
member(Month,AlbertMonths),
% Clue-2 Bernard: I didn't know originally, but now I do.
Table1 = [(M,D) : M in AlbertMonths, D in Days, member((M,D),Table)],
member(Day,Days), % Bernard was told a day
findall(M,member((M,Day),Table)) = [_,_|_], % I didn't know originally
findall(M,member((M,Day),Table1)) = [Month], % but now I do (Albert: Well, now I know, too!)
writeln((Month,Day)).
% Clue-1 Albert: I don't know when your birthday is, but I know Bernard doesn't know, either.
clue1(Table,Months,Days,Month) =>
Months1 = [M : M in Months, findall(D,member((M,D),Table))=[_,_|_]], % Albert doesn't know
member(Month,Months1), % Albert was told a month
foreach (Day in Days) % Bernard doesn't know, either.
if member((Month,Day),Table) then
findall(M,member((M,Day),Table)) = [_,_|_]
end
end.