編集:「日食」タグを見逃したので、おそらくこれはあなたが探している答えではありません。ただし、プレーンなProlog、つまりSWIで動作します。
したがって、参加者の列挙があります。少なくとも、それを推測する必要はありません。それから始めましょう:
- 船:「アエトス」、「オストリア」、「バティス」、「アルバトロス」、「ティエラ」
- 男性:「ミルトス」、「タキス」、「アルギリス」、「クロニス」、「フォイボス」
- 女性:「マロ」、「オルガ」、「バシア」、「マグダ」、「ザラ」
- 時間:「16」、「19」、「21」、「24」、「27」
ルール:時間を値として使用してください!:
1 Argiris = Ostria,
2 Magda \= Miltos, Magda \= Takis,
Xronis \= Albatross, Maro \= Albatross, Xronis \= 24, Maro \= 24,
%% does that mean they were together in one boat??
3 Olga = Batis, Aetos \= 27,
4 ( Thiella = Miltos ; Thiella = Takis) , Thiella \= Basia,
5 Xara = 16, Olga > Magda,
6 Takis = 21
select/2
ドメイン選択に使用:
select([A|B], C):- select(A,C,C2), select(B,C2).
select([],_).
コーディングを開始する準備が整いました。最も明確なステートメントが最初になります。定義されるまで変数をテストしないことが重要です。
sailing(_Vars):-
Dom = [16,19,21,24,27], %% the domain
Takis = 21,
select( [Takis, Miltos, Argiris, Xronis, Foibos], Dom), Xronis \= 24,
Xara = 16,
select( [Xara, Maro, Magda, Olga, Basia], Dom), Maro \= 24,
Magda \= Takis, Magda \= Miltos, Olga > Magda,
Olga = Batis, Argiris = Ostria,
select( [Batis, Ostria, Aetos, Albatross, Thiella], Dom), Aetos \= 27,
Thiella \= Basia,
(Thiella = Miltos ; Thiella = Takis),
Xronis \= Albatross, Maro \= Albatross.
これは私に57の解決策を与えます。したがって、おそらくXronis
、Maro
同じボートに入れる必要があります。それを試してみてください。
あなたの答えをどのように報告するかは、追加の懸念事項です。上記はソルバーを示しています。
1つの方法は、上記のコードを次のように微調整することです。
solve([Takis, Miltos, Argiris, Xronis, Foibos]) :- ... .
と呼び?- solve(Men)
、それぞれの時間割り当てを確認しMen
ます。もう1つは、コードを次のように変更することです。
pair( A-B, A, B).
solve(Result) :-
... ,
keysort( [Takis-'Takis', Miltos-'Miltos', Argiris-'Argiris',
Xronis-'Xronis', Foibos-'Foibos'], TM),
maplist( pair,TM,Times,Men),
keysort( [Xara-'Xara', Maro-'Maro', Magda-'Magda',
Olga-'Olga', Basia-'Basia'], TW),
maplist( pair,TW,Times,Women),
... ,
maplist( pair,TV,Times,Vessels),
Result = [Vessels,Men,Women,Times],
maplist( writeln, Result).
Result
さらに、4つのリストを結合されたデータの1つの置き換えられたリストに変換したい場合は、さらに数回のmaplist/4
呼び出しでそれを行うこともできます。
maplist( pair,VM,Vessels,Men), maplist( pair,WT,Women,Times),
maplist( quad,Result,VM,WT).
quad( (A,B,C,D), A-B, ... ).