【发布时间】:2015-05-17 08:13:04
【问题描述】:
我正在尝试解决序言中的一个难题,我只做了一部分,我不知道如何完成它。 这就是问题所在:
考虑四个姓氏为 Baker、Carpenter、Miller 和 Farmer 的人。假设这个群体代表的四种职业包括面包师、木匠、磨坊主和农民。进一步假设每个人的职业与其姓氏不符。
这四个人各有一个儿子。四个儿子的职业是面包师、木匠、磨坊主和农民。再次假设每个人的职业与其姓氏不符。
假设我们还知道以下事实: 没有儿子的职业与父亲相同。 贝克的职业与木匠的儿子一样。 农夫的儿子是一名面包师。
我不知道如何实现的部分是:
Baker has the same profession as the carpenter's son.
The farmer's son is a baker.
这是我到目前为止所提出的部分问题的代码:
DOMAINS
father = father(lastname,profession)
son = son(lastname2,profession2)
list2 = son*
list = father*
lastname = string
profession = string
lastname2 = string
profession2 = string
PREDICATES
nondeterm member(father, list)
nondeterm member(son,list2)
solution
CLAUSES
member(Item, [Item|_]).
member(Item,[_|Tail]) :- member(Item,Tail).
solution:-
List = [father("Baker" , BakerFatherJob),
father("Carpenter" , CarpenterFatherJob),
father("Miller" , MillerFatherJob),
father("Farmer",FarmerFatherJob)],
List2 = [son("Baker" , BakerSonJob),
son("Carpenter" , CarpenterSonJob),
son("Miller" , MillerSonJob),
son("Farmer",FarmerSonJob)],
member(father(_, "Baker"), List),
member(father(_, "Carpenter"), List),
member(father(_, "Miller"), List),
member(father(_, "Farmer"), List),
member(son(_, "Baker"), List2),
member(son(_, "Carpenter"), List2),
member(son(_, "Miller"), List2),
member(son(_, "Farmer"), List2),
BakerFatherJob<>BakerSonJob,
CarpenterFatherJob<>CarpenterSonJob,
MillerFatherJob<>MillerSonJob,
FarmerFatherJob<>FarmerSonJob,
BakerFatherJob <> "Baker",
CarpenterFatherJob <> "Carpenter",
MillerFatherJob <> "Miller",
FarmerFatherJob <> "Farmer",
BakerSonJob <> "Baker",
CarpenterSonJob <> "Carpenter",
MillerSonJob <> "Miller",
FarmerSonJob <> "Farmer",
write("Father Baker has job ", BakerFatherJob),nl,
write("Father Carpenter has job ", CarpenterFatherJob), nl,
write("Father Miller has job ", MillerFatherJob),nl,
write("Father Farmer has job ", FarmerFatherJob),nl,
write(" "), nl,
write("Son Baker has job ", BakerSonJob),nl,
write("Son Carpenter has job ", CarpenterSonJob), nl,
write("Son Miller has job ", MillerSonJob),nl,
write("Son Farmer has job ", FarmerSonJob),nl,
write(" "), nl,
fail.
solution:-
write(" ALL SOLUTIONS HAVE BEEN FOUND")
【问题讨论】:
-
我解决了:BakerFatherJob = CarpenterSonJob, FarmerSonJob = "Baker", . 这很容易。
-
不,那是错误的。变量
CarpenterSonJob持有一个名叫Carpenter 的人的儿子的工作,他不是木匠。 T 找到“木匠的儿子”,你需要找到一个工作是木匠的父亲(你已经这样做了,顺便说一句),抓住他的名字,找到一个同名的儿子,然后那是你的“木匠之子”!
标签: prolog zebra-puzzle