1

我是新用户,我需要你的 prolog 程序帮助。

帆船俱乐部“Thalassa”最近举办了一场针对年轻水手的比赛,两人的船。每艘船的船员都是一男一女。

  1. “Ostria”号船的一名船员是“Argiris”。
  2. 玛格达既没有和“Miltos”在一起,也没有和“Taki”在一起。“Xronis”和“Maro”不在“信天翁”中,也没有在 24 分钟内完成。
  3. “Olga”登上“Batis”,而“Aetos”没有在 27 分钟内完成。
  4. 在“Thiella”或“Miltos”或“Takis”中,没有登上“Basia”。
  5. “Xara”在 16 分钟内完成。“奥尔加”比“玛格达”花费了更多的时间来完成。
  6. “塔基斯”与搭档用时21分钟完成比赛。

船只:“Aetos”、“Ostria”、“Batis”、“Albantros”、“Thiella” 男性:“Miltos”、“Takis”、“Argiris”、“Xronis”、“Foibos” 女性:“Maro”、“Olga” 、“Basia”、“Magda”、“Xara”次:“16”、“19”、“21”、“24”、“27”

我需要一个程序来问?solve(X) 并给我一个正确组合的列表,例如 X=Aetos, Takis, Maro, 16

4

1 回答 1

0

编辑:我错过了“eclipse”标签,所以也许这不是你要找的答案。它可以在普通的 Prolog 中工作,即 SWI。


所以你确实有参与者的枚举,至少我们不需要推断。从它开始:

  • 船只:“Aetos”、“Ostria”、“Batis”、“Albatross”、“Thiella”
  • 男子:“Miltos”、“Takis”、“Argiris”、“Xronis”、“Foibos”
  • 女性:“Maro”、“Olga”、“Basia”、“Magda”、“Xara”
  • 次:“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确实需要放在同一条船上。试试看。


如何报告您的答案是另一个问题。上面显示了求解器。

一种方法是调整上面的代码,例如

solve([Takis, Miltos, Argiris, Xronis, Foibos]) :- ... .

并将其称为?- solve(Men),以查看每个 的时间分配Men。另一种是将代码更改为例如

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为一个组合数据的转置列表,您也可以通过更多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 回答