54 lines
2.2 KiB
Prolog
54 lines
2.2 KiB
Prolog
:- use_module(library(clpfd)).
|
|
|
|
zebra :-
|
|
Nation = [Englishman, Spaniard, Japanese, Ukrainian, Norwegian ],
|
|
Color = [Red, Green, White, Yellow, Blue ],
|
|
Smoke = [Oldgold, Kools, Chesterfield, Luckystrike, Parliament],
|
|
Pet = [Dog, Snails, Fox, Horse, Zebra ],
|
|
Drink = [Tea, Coffee, Milk, Orangejuice, Water ],
|
|
|
|
% house numbers 1 to 5
|
|
Nation ins 1..5,
|
|
Color ins 1..5,
|
|
Smoke ins 1..5,
|
|
Pet ins 1..5,
|
|
Drink ins 1..5,
|
|
|
|
% the values in each list are exclusive
|
|
all_different(Nation),
|
|
all_different(Color),
|
|
all_different(Smoke),
|
|
all_different(Pet),
|
|
all_different(Drink),
|
|
|
|
% actual constraints
|
|
Englishman #= Red,
|
|
Spaniard #= Dog,
|
|
Green #= Coffee,
|
|
Ukrainian #= Tea,
|
|
Green #= White + 1,
|
|
Oldgold #= Snails,
|
|
Yellow #= Kools,
|
|
Milk #= 3,
|
|
Norwegian #= 1,
|
|
(Chesterfield #= Fox - 1 #\/ Chesterfield #= Fox + 1),
|
|
(Kools #= Horse - 1 #\/ Kools #= Horse + 1),
|
|
Luckystrike #= Orangejuice,
|
|
Japanese #= Parliament,
|
|
(Norwegian #= Blue - 1 #\/ Norwegian #= Blue + 1),
|
|
|
|
% get solution
|
|
flatten([Nation, Color, Smoke, Pet, Drink], List), label(List),
|
|
|
|
% print the answers
|
|
sort([Englishman-englishman, Spaniard-spaniard, Japanese-japanese, Ukrainian-ukrainian, Norwegian-norwegian], NationNames),
|
|
sort([Red-red, Green-green, White-white, Yellow-yellow, Blue-blue], ColorNames),
|
|
sort([Oldgold-oldgold, Kools-kools, Chesterfield-chesterfield, Luckystrike-luckystrike, Parliament-parliament], SmokeNames),
|
|
sort([Dog-dog, Snails-snails, Fox-fox, Horse-horse, Zebra-zebra], PetNames),
|
|
sort([Tea-tea, Coffee-coffee, Milk-milk, Orangejuice-orangejuice, Water-water], DrinkNames),
|
|
Fmt = '~w~16|~w~32|~w~48|~w~64|~w~n',
|
|
format(Fmt, NationNames),
|
|
format(Fmt, ColorNames),
|
|
format(Fmt, SmokeNames),
|
|
format(Fmt, PetNames),
|
|
format(Fmt, DrinkNames).
|