0

这是一个谜语的信息


六名口译员:Fran 法语、Geraldine German、Dudley Dutch、Spike 西班牙语、Polly 波兰语和罗马尼亚语 Ron。每个人都会说两种语言,其中表明他们的姓氏,即法语(French)、Deutsch(德语)、Dutch(荷兰语)、西班牙语(Spanish)、波兰语(Polish)和罗马尼亚语(Romanian)。以下适用:

  1. 没有口译员会说与他的姓氏相对应的语言。
  2. 没有两个口译员会说相同的两种语言 ​</li>
  3. 六种语言中的每一种都由两个口译员讲。
  4. 斯派克会说荷兰语和德语。
  5. 有会说荷兰语和波兰语的翻译。
  6. Fran 和 Dudley 会讲四种语言(各两种),与他们的姓氏不对应。
  7. 以达德利所说的语言为姓氏的口译员会说法语。
  8. 没有会说德语和波兰语的翻译。

每个口译员都说什么语言?


这是我到现在为止所做的。规则 1,4 和 8 正在返回正确的结果。

interpreter(fran,french).
interpreter(geraldine,german).
interpreter(dudley,dutch).
interpreter(spike,spanish).
interpreter(polly,polish).
interpreter(ron,romanian).

language(french).
language(german).
language(dutch).
language(spanish).
language(polish).
language(romanian).



%rule 1                                                                     OK
rule1([X,Y,Z,W]):- interpreter(X,Y), language(Z), language(W),   
                not(Z=W;Y=Z;Y=W),
                Z\=W, Z@<W.


%rule 2    
    %rule2([X,Y,Z,W]):- interpreter(X,Y), language(Z), language(W).
                    %interpreter(I2,S2), language(Z2), language(W2).
                    %not(X1=X2),
                    %((Z1=Z2) -> not(W1=W2)).



%rule 3
rule3([X,Y,Z,W]):- interpreter(X,Y), language(Z1), language(W), 
                interpreter(X,Y), language(Z1), language(W), 
                interpreter(X,Y), language(Z2), language(W), 
                not(Z1=Z2).

%rule 4                                                                 OK
rule4([X,Y,Z,W]):-  (X=spike -> Z=dutch,W=german;Z=_,W=_).

%rule 5
rule5([X,Y,dutch,polish]).

%rule 6
rule6a([fran,french,Z,W]):- interpreter(X,Y), language(Z1), language(W), 
                not(Z=dutch).
rule6b([dudley,dutch,Z,W]):- interpreter(X,Y), language(Z1), language(W), 
                not(Z=french).
    /*      
%rule 7
rule7([dudley,dutch,Z,W]):- rule7a(X,Z,L1,french),
                        rule7b(X,Z,french,L2),
                        rule7c(X,W,L1,french),
                        rule7d(X,W,french,L2).
                        */
%rule 8                                                                 OK
rule8([X,Y,Z,W]):- interpreter(X,Y), language(Z), language(W), 
                ((Z=german)-> not(W=polish);Z=_,W=_).   


solution(X):- rule1(X), rule2(X), rule3(X), rule4(X), rule5(X), rule6(X), rule7(X), rule8(X), .

我主要需要规则 2 和 7 的帮助。任何帮助表示赞赏。

4

1 回答 1

0

我试图在这里解决这个难题

我发现这种在此类问题中施加约束的方法更容易。

:- use_rendering(table,
         [header(h('Name','Surname','L1','L2'))]).

interpreters(Is) :-
    length(Is,6),
    member(h(fran,french,_,_), Is),
    member(h(geraldine,german,_,_), Is),
    member(h(dudley,dutch,_,_), Is),
    member(h(spike,spanish,_,_), Is),
    member(h(polly,polish,_,_), Is),
    member(h(ron,romanian,_,_), Is),
    member(h(_,_,french,_), Is),member(h(_,_,_,french), Is),
    member(h(_,_,german,_), Is),member(h(_,_,_,german), Is),
    member(h(_,_,dutch,_), Is),member(h(_,_,_,dutch), Is),
    member(h(_,_,spanish,_), Is),member(h(_,_,_,spanish), Is),
    member(h(_,_,polish,_), Is),member(h(_,_,_,polish), Is),
    member(h(_,_,romanian,_), Is),member(h(_,_,_,romanian), Is),
    \+member(h(_,X,X,_), Is),
    \+member(h(_,Y,_,Y), Is),
    (member(h(spike,spanish,dutch,german), Is);member(h(spike,spanish,german,dutch), Is)),
    (member(h(_,_,dutch,polish), Is);member(h(_,_,polish,dutch), Is)),
    member(h(fran,french,E,F), Is),member(h(dudley,dutch,G,H), Is),E \= G, F \= G, E \= H, F \= H,
    member(h(dudley,dutch,I,J), Is), (member(h(_,I,_,french), Is);member(h(_,I,french,_), Is)), (member(h(_,J,_,french), Is);member(h(_,J,french,_), Is)),
    \+member(h(_,_,german,polish), Is),
    \+member(h(_,_,polish,german), Is),
    \+member(h(_,_,K,K), Is).

输出之一是

在此处输入图像描述

于 2019-12-03T17:53:11.350 回答