ゼブラパズルは、5軒の家がそれぞれ違う色で塗られている、有名な論理パズルです。 家にはそれぞれ違う住人が住んでいて、国籍も、飼っているペットも、飲み物も、趣味も異なります。
パズルを解くために、解答を説明する15個の文が与えられます。 ただし、_すべての_文の情報を組み合わせてはじめて、パズルの解答を見つけることができます。
ゼブラパズルは、制約充足問題(CSP)です。 このような問題では、取りうる値の集合と、どの値が有効かを制限する制約の集合があります。 よく知られた制約充足問題としては、ほかにも数独があります。
課題は、ゼブラパズルを解いて、次の2つの問いの答えを見つけることです。
次の15の命題は、すべて真であることがわかっています。
さらに、5軒の家はそれぞれ異なる色に塗られ、住人はそれぞれ異なる国籍で、異なるペットを飼い、異なる飲み物を飲み、異なる趣味を持っています。
解の候補は240億通り(5!⁵ = 24,883,200,000)あります。できるだけ多くの解を排除してみましょう。
SolvePuzzleという関数を1つ定義してください。この関数は、2つの文字列を含む解答を返します。その文字列の値は、ゼブラパズルの「Who drinks water?」と「Who owns the Zebra?」という問いへの答えです。それぞれの答えは、住人の国籍、つまりEnglishman、Spaniard、Ukrainian、Norwegian、Japaneseのいずれかになります。
もちろん、テストプログラムを覗いて期待される解答を確認すれば、1行だけの関数を書いて済ませることもできるでしょう。しかし、ここでの目標は、パズルに与えられた事実と制約を使ってアルゴリズムを組み立て、2つの正しい答えを導き出すことです。