逻辑解决问题以检查答案是否正确。根据线索:
五个阿姨: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.
答案 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