1

私は新しいユーザーです。プロローグプログラムのサポートが必要です。

セーリングクラブ「タラッサ」は最近、2人乗りの若い船乗りのためのコンテストを開催しました。各船の乗組員は男の子と女の子でした​​。

  1. 船「オストリア」の乗組員の一人は「アルギリス」でした。
  2. マグダは「ミルトス」にも「タキ」にもいなかった。「Xronis」と「Maro」は「Albatross」に含まれず、24分で終了しませんでした。
  3. 「バティス」に乗った「オルガ」、「アエトス」は27分で終了しなかった。
  4. 「ティエラ」には「ミルトス」または「タキス」があり、「バシア」には乗っていませんでした。
  5. 「ザラ」は16分で終了しました。「オルガ」は「マグダ」よりも完成までに時間がかかりました。
  6. パートナーとの「タキス」は21分でレースを終えました。

船:「Aetos」、「Ostria」、「Batis」、「Albantros」、「Thiella」男性:「Miltos」、「Takis」、「Argiris」、「Xronis」、「Foibos」女性:「Maro」、「Olga」 、"Basia"、 "Magda"、 "Xara"回: "16"、 "19"、 "21"、 "24"、 "27"

質問するプログラムが必要ですか?解決(X)し、正しい組み合わせのリストを表示します(例:X = Aetos、Takis、Maro、16)

4

1 に答える 1

0

編集:「日食」タグを見逃したので、おそらくこれはあなたが探している答えではありません。ただし、プレーンな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の解決策を与えます。したがって、おそらくXronisMaro同じボートに入れる必要があります。それを試してみてください。


あなたの答えをどのように報告するかは、追加の懸念事項です。上記はソルバーを示しています。

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, ... ).
于 2012-11-26T07:35:11.573 に答える