Пазл Четыре профессии пролог
Я пытаюсь решить головоломку в прологе, и я сделал только ее часть, я не могу понять, как ее закончить. Это проблема:
Рассмотрим четырех человек с фамилиями Бейкер, Карпентер, Миллер и Фермер. Предположим, что четыре профессии, представленные этой группой, включают пекаря, плотника, мельника и фермера. Предположим далее, что у каждого человека есть профессия, которая не соответствует его фамилии.
У каждого из этих четырех человек есть сын. Четыре сына имеют профессии пекаря, плотника, мельника и фермера. Предположим еще раз, что у каждого человека есть профессия, которая не соответствует его фамилии.
Предположим, что мы также знаем следующие факты: Ни один сын не имеет такой же профессии, как его отец. Пекарь имеет ту же профессию, что и сын плотника. Сын фермера - пекарь.
Часть, которую я не могу понять, как реализовать:
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")
1 ответ
Прямо сейчас вы называете рабочие места людей,
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 = ... ,
Сын фермера - пекарь.
Теперь вы тоже можете это сделать.
Урок: назови свои вещи; используйте описательные имена, чтобы облегчить когнитивную нагрузку.