逻辑上不正确的答案

时间:2013-05-07 01:59:05

标签: prolog

我测试了这段代码。我在没有使用prolog的情况下逻辑地解决了它,答案是不同的。我无法理解错误在哪里!这些是我的线索:

玛丽史密斯将她的五对阿姨和叔叔的五个结婚礼物放入一个堆叠中,后来才意识到她心不在焉地将所有五张卡片放在堆叠顶部的一堆纸上。不记得哪位阿姨和叔叔送了哪件礼物。每一对阿姨(Amber,Emily,Janet,Maisie和Patsy)和叔叔(比尔,道格,尼克,汤姆或扎克)都生活在一个不同的州(包括爱荷华州)并发送了一个不同的项目(一个是花瓶)。你可以将每个阿姨和叔叔配对他们各自的状态和礼物吗?

  1. Maisie姨妈的丈夫是Uncle Nick。
  2. 比尔叔叔和艾米丽姨妈以及他们各自的配偶按顺序送了托盘和骨灰盒。
  3. Amber Amber和Doug叔叔住在佐治亚州。
  4. 帕齐姨妈和她的丈夫送了烤面包机。
  5. rotissererie来自特拉华州的亲戚。
  6. Zack叔叔和他的妻子(不住在堪萨斯州)既不送托盘也不送烤面包机。
  7. 珍妮特姨妈和比尔叔叔住在加利福尼亚州。
  8. 这是我的逻辑推理:

    逻辑解决问题以检查答案是否正确。根据线索:

    五个阿姨:Amber,Emily,Janet,Maisie,Patsy。

    五个叔叔:比尔,道格,尼克,汤姆,扎克。

    五个州:加利福尼亚州,特拉华州,乔治亚州,爱荷华州,堪萨斯州。

    五件礼物:Rotiseserie,Salver,Urn,Toaster,Vase

    根据第一条线索,我们可以一起加入Maisie和Nick。根据第三点,我们也可以加入Amber和Doug,并在格鲁吉亚生活。根据第七条线索,我们也可以加入生活在加利福尼亚的珍妮特和比尔。

    发现:Maisie&尼克在一起。

    发现:琥珀&道格在一起并住在佐治亚州。

    发现:珍妮特&比尔在一起并住在加利福尼亚州。

    根据线索5,我们可以说Amber和Doug没有给他们生活在格鲁吉亚,而不是特拉华州的rotissererie。对于住在加利福尼亚州的珍妮特和比尔,我们也可以说。

    发现:Rotienrerie并非由Amber&道格和珍妮特&比尔。

    我们和Patsy和Emily一起离开了。 Patsy根据线索4发送烤面包机,所以与线索6联系,她不是Zack的妻子。然后我们发现Patsy是Tom的妻子,而Zack是Emily的丈夫,因为我们已经了解了所有其他人。我们也知道,根据线索6,扎克不住在堪萨斯州。

    发现:Patsy&汤姆在一起

    发现:Emily&扎克在一起。

    珍妮特夫妇或艾米莉夫妇通过线索两个发送了托盘和骨灰盒。我们知道Emily夫妇没有通过第六条线索发送托盘,所以这给了我们另外两个事实,即Emily夫妇发送了瓮,而珍妮特夫妇送了托盘。

    发现:Emily&扎克送了瓮。

    发现:珍妮特&比尔送了托盘。 [janet,bill,california,salver]。

    根据线索4,Patsy夫妇送了烤面包机。因此,另一个人排除了特拉华州。

    发现:Patsy&汤姆送了烤面包机,不住在特拉华州。

    由于Amber和Doug住在佐治亚州,我们可以说他们送了花瓶。

    发现:琥珀&道格送了花瓶。 [琥珀,道格,格鲁吉亚,花瓶]。

    现在我们可以说Maisie和Nick送来了rotissererie,因为它是唯一剩下的人。因此,他们住在特拉华州。

    发现:Maisie&尼克送了Rotisserie并住在特拉华州。 [maisie,nick,delaware,rotissererie]。

    第六条线索告诉我们,艾米莉夫妇不住在堪萨斯州。所以唯一剩下的就是爱荷华州。这也让我们自然地得到了最后的答案,Patsy夫妇住在堪萨斯州。

    发现:Emily&扎克住在爱荷华州[艾米莉,扎克,爱荷华州,瓮]。

    发现:Patsy&汤姆住在堪萨斯[patsy,汤姆,堪萨斯,烤面包机]。

    这是我的序言:

    livesIn(State):-
    member(State,[california,georgia,delaware,iowa,kansas]).
    
    sentGift(Gift):-
    member(Gift,[rotisserie,salver,toaster,urn,vase]).
    
    isHusband(Husband):-
    member(Husband,[bill,doug,nick,tom,zack]).
    
    solve(Z):-
    
    Z=[[amber,Husband1,State1,Gift1],
       [emily,Husband2,State2,Gift2],
       [janet,Husband3,State3,Gift3],
       [maisie,Husband4,State4,Gift4],
       [patsy,Husband5,State5,Gift5]],
    
    isHusband(Husband1), isHusband(Husband2), isHusband(Husband3), isHusband(Husband4), isHusband(Husband5),
    Husband1 \== Husband2, Husband1 \== Husband3, Husband1 \== Husband4, Husband1 \== Husband5,
    Husband2 \== Husband1, Husband2 \== Husband3, Husband2 \== Husband4, Husband2 \== Husband5,
    Husband3 \== Husband1, Husband3 \== Husband2, Husband3 \== Husband4, Husband3 \== Husband5,
    Husband4 \== Husband1, Husband4 \== Husband2, Husband4 \== Husband3, Husband4 \== Husband5,
    Husband5 \== Husband1, Husband5 \== Husband2, Husband5 \== Husband3, Husband5 \== Husband4,
    
    livesIn(State1), livesIn(State2), livesIn(State3), livesIn(State4), livesIn(State5),
    State1 \== State2, State1 \== State3, State1 \== State4, State1 \== State5,
    State2 \== State1, State2 \== State3, State2 \== State4, State2 \== State5,
    State3 \== State1, State3 \== State2, State3 \== State4, State3 \== State5,
    State4 \== State1, State4 \== State2, State4 \== State3, State4 \== State5,
    State5 \== State1, State5 \== State2, State5 \== State3, State5 \== State4,
    
    sentGift(Gift1), sentGift(Gift2), sentGift(Gift3), sentGift(Gift4), sentGift(Gift5),
    Gift1 \== Gift2, Gift1 \== Gift3, Gift1 \== Gift4, Gift1 \== Gift5,
    Gift2 \== Gift1, Gift2 \== Gift3, Gift2 \== Gift4, Gift2 \== Gift5,
    Gift3 \== Gift1, Gift3 \== Gift2, Gift3 \== Gift4, Gift3 \== Gift5,
    Gift4 \== Gift1, Gift4 \== Gift2, Gift4 \== Gift3, Gift4 \== Gift5,
    Gift5 \== Gift1, Gift5 \== Gift2, Gift5 \== Gift3, Gift5 \== Gift4,
    
    %Aunt Maisie's Husband is Uncle Nick
    
    Husband4 = nick,
    
    %Uncle Bill and Aunt Emily and their respective spouses sent the salver and the urn (in some order)
    
    
    member([_, bill, _, salver], Z); member([_, bill, _, urn], Z),
    Gift2 = salver; Gift2 = urn,
    
    %Aunt Amber and Uncle Doug live in Georgia
    
    Husband1 = doug,
    State1 = georgia,
    
    %Aunt Patsy and her husband sent a toaster
    
    Gift5 = toaster,
    
    %The rotisserie came from the Delaware relatives
    
    member([_, _, delaware, rotisserie], Z),
    
    %Uncle Zack and his wife(don't live in Kansas) sent neither the salver nor the toaster
    
    \+ member([_, zack, kansas, _], Z),
    \+ member([_, zack, _, salver], Z),
    \+ member([_, zack, _, toaster], Z),
    
    %Aunt Janet and Uncle Bill live in California
    
    Husband3 = bill,
    State3 = california.
    

1 个答案:

答案 0 :(得分:0)

你需要围绕析取的括号,因为(;)/ 2优先级高于(,)/ 2

%Uncle Bill and Aunt Emily and their respective spouses sent the salver and the urn (in some order)
( member([_, bill, _, salver], Z); member([_, bill, _, urn], Z) ),
( Gift2 = salver; Gift2 = urn ),

但逻辑不正确:我会尝试改为

( member([BillWife, bill, _, BillGift], Z),
  member([emily, EmilyHusband, _, EmilyGift], Z),
  ( BillGift = salver, EmilyGift = urn
  ; BillGift = urn, EmilyGift = salver),
  BillWife \= emily, EmilyHusband \= bill
),

我认为这个条件不是线索的意图。我会写

%Uncle Zack and his wife(don't live in Kansas) sent neither the salver nor the toaster
member([_, zack, ZackState, _], Z), ZackState \= kansas,
\+ member([_, zack, ZackState, salver], Z),
\+ member([_, zack, ZackState, toaster], Z),

样式注释:这些代码块

isHusband(Husband1), isHusband(Husband2), isHusband(Husband3), isHusband(Husband4), isHusband(Husband5),
Husband1 \== Husband2, Husband1 \== Husband3, Husband1 \== Husband4, Husband1 \== Husband5,
...

实际上是不可读的,因此存在错误的概率。 CLP(FD)所需的功能all_different / 1,但等效 - 除了性能 - 您可以使用

...
permutation([bill,doug,nick,tom,zack],[Husband1,Husband2,Husband3,Husband4,Husband5]),
...

HTH