1

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

玛丽·史密斯把她五对叔叔阿姨的五张结婚礼物都放在了一堆,直到后来她才意识到自己心不在焉地把五张卡片都放在了一堆,而且不能记住哪位阿姨和叔叔送了什么礼物。每对阿姨(Amber、Emily、Janet、Maisie 和 Patsy)和叔叔(Bill、Doug、Nick、Tom 或 Zack)生活在不同的州(包括爱荷华州)并寄送不同的物品(一个是花瓶)。你能把每一对阿姨和叔叔与他们各自的状态和礼物相匹配吗?

  1. 麦茜阿姨的丈夫是尼克叔叔。
  2. 比尔叔叔和艾米莉婶婶以及他们各自的配偶按顺序送来了托盘和骨灰盒。
  3. 安伯阿姨和道格叔叔住在佐治亚州。
  4. 帕西阿姨和她的丈夫送来了烤面包机。
  5. 烤肉店来自特拉华州的亲戚。
  6. 扎克叔叔和他的妻子(不住在堪萨斯州)既没有送托盘,也没有送烤面包机。
  7. 珍妮特阿姨和比尔叔叔住在加利福尼亚。

这是我的逻辑推理:

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

五位阿姨:Amber、Emily、Janet、Maisie、Patsy。

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

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

五件礼物:烤肉店、托盘、骨灰盒、烤面包机、花瓶

根据第一条线索,我们可以将 Maisie 和 Nick 一起加入。根据第三个,我们也可以和 Amber 和 Doug 一起住在乔治亚州。根据第七条线索,我们还可以加入住在加利福尼亚的珍妮特和比尔。

发现: Maisie 和 Nick 在一起。

发现:Amber 和 Doug 在一起并住在佐治亚州。

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

根据线索 5,我们可以说 Amber 和 Doug 没有提供烤肉店,因为他们住在乔治亚州,而不是特拉华州。我们也可以对住在加利福尼亚的珍妮特和比尔说。

发现:Amber & Doug 和 Janet & Bill 都没有送出 Rotissererie。

我们留下了帕齐和艾米丽。Patsy 根据线索 4 送出烤面包机,因此与线索 6 结合,她不是 Zack 的妻子。然后我们发现 Patsy 是 Tom 的妻子,而 Zack 是 Emily 的丈夫,因为我们已经知道所有其他人了。我们也知道,根据线索 6,扎克并不住在堪萨斯州。

发现:Patsy 和 Tom 在一起

发现:艾米丽和扎克在一起。

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

发现:Emily & Zack 送来了骨灰盒。

发现:珍妮特和比尔送来了托盘。[珍妮特,比尔,加利福尼亚,托盘]。

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

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

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

发现:Amber & Doug 送来了花瓶。[琥珀,道格,乔治亚,花瓶]。

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

发现: Maisie & Nick 送了 Rotisserie 并住在特拉华州。[maisie,尼克,特拉华州,烤肉店]。

第六条线索告诉我们,艾米丽夫妇并不住在堪萨斯州。所以只剩下爱荷华了。这也自然地给了我们最后一个答案,Patsy 夫妇住在堪萨斯州。

发现:Emily & Zack 住在爱荷华州 [emily, zack, iowa, urn]。

发现:Patsy & Tom 住在堪萨斯州 [patsy, tom, kansas, toaster]。

这是我的序言代码:

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.
4

1 回答 1

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]),
...

高温高压

于 2013-05-07T05:43:42.563 回答