2017-02-28 9 views
0

私はこの4つの異なる色(青、赤、緑、黄)のウィザードのグリッドを作成するプログラムを設計する必要があるこのPrologの質問に取り組んでいます。それぞれの帽子には4つの異なる文字(w、x、y、z)のいずれかがあります。帽子は、行や列に同じ色の帽子が2つ、または同じ文字の帽子が入っていないように配置する必要があります。プロローグ内のリスト内の反復可能な変数をチェックする方法

行が有効である場合、つまり2つの帽子が同じ色または同じ文字を持たない場合、真である述語validRowを記述する必要があります。

例:

?- validRow([(1, 1, red, w), (1, 2, green, x), (1, 3, yellow, y), (1, 4, blue, z)]). 
true. 

これは私のコードでは、これまで

validRow([(R,C1,Colour1,Letter1), (R,C2,Colour2,Letter2),(R,C3,Colour3,Letter3), (R,C4,Colour4,Letter4)]) :- 
    isValid([Colour1,Colour2,Colour3,Colour4], [Letter1,Letter2,Letter3,Letter4]). 

isValid([HC|TC],[HL|TL]) :- 
    not(member(HC,TC)), 
    not(member(HL,TL)), 
    isValid(TC,TL). 

これは私に正しい答えを与えるものではありません。どうすればこの問題を解決できますか?

答えて

1

再帰にはベースケースが必要です。 isValidの1つを指定していません。

+0

isValid([]、[])。これはベースケースとして機能しますか? – user7630822

+1

あなたはそれを試して何が起こったのですか? –

+0

@ user7630822 is isValid([]、[])。 '' isValid'の定義に基づいて真ですか? – lurker

関連する問題