我正在尝试解决prolog中的难题,而我只制作了其中的一部分,我不知道如何完成它。这是问题:
考虑四个男人,贝克,木匠,米勒和农民的姓氏。假设该小组代表的四个职业包括面包师,一个木匠,米勒和一个农民。进一步假设每个人的职业都与姓氏不符。
这四个男人中的每个人都有一个儿子。这四个儿子有贝克,木匠,米勒和农民的职业。再次假设每个人的职业都与他们的姓氏不符。
假设我们也知道以下事实: 没有儿子与他的父亲相同。 贝克与木匠的儿子具有相同的职业。 农民的儿子是面包师。
我无法弄清楚如何实现的部分是:
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")
现在您正在命名人民的工作,
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( OlderBakerName, "Baker"), List),
member( father( OlderCarpenterName, "Carpenter"), List),
member( father( OlderMillerName, "Miller"), List),
member( father( OlderFarmerName, "Farmer"), List),
member( son( YongerBakerName, "Baker"), List2),
member( son( YongerCarpenterName, "Carpenter"), List2),
member( son( YongerMillerName, "Miller"), List2),
member( son( YongerFarmerName, "Farmer"), List2),
此时,所有工作和人的名字均分配。现在您可以写下您的缺失规则:
贝克与木匠的儿子具有相同的职业。
"贝克"这是一个名称(否则我们与下一个规则矛盾)。他一定是父亲(为什么?),所以他的工作是BakerFatherJob
。木匠的名字(再次,必须是父亲 - 为什么?)是不是"木匠" - 这是规则所禁止的。我们将他命名为OlderCarpenterName
。他的儿子有相同的名字:
member( son( ... , JobX ), List.... ),
,我们知道这两个工作是相同的:
JobX = ... ,
农民的儿子是面包师。
现在您也可以做到。
课程:命名您的东西;使用描述性名称来减轻认知负载。