gpt4 book ai didi

Prolog puzzle baker、meatman 和 carpenter

转载 作者:行者123 更新时间:2023-12-02 08:33:58 25 4
gpt4 key购买 nike

这是我在网上找到的一个非常简单的谜题,我在网上找不到任何解决方案。规则很简单:

  • 有 6 位工匠,M.Baker 父子,M.Carpenter 父子,M.Meatman 父子
  • 每个工匠都可以是面包师、木匠或肉匠
  • 儿子和父亲不能做同样的工作
  • 姓氏不能是工作名称(M.Baker 和他的儿子不能是面包师)

我们知道:- M.Meatman 的儿子是面包师- M.Baker 与 M.Carpenter 的儿子做同样的工作

我实现了这个谓词:

% swipl prolog
% M.Meatman's son is baker
% M. Baker do job of M. Carpenter's son

% jobs
job(baker).
job(meatman).
job(carpenter).

% fathers
artisan(fatherbaker).
artisan(fathercarpenter).
artisan(fathermeatman).

% sons
artisan(sonbaker).
artisan(soncarpenter).
artisan(sonmeatman).

% some links
father(fatherbaker, sonbaker).
father(fathermeatman, sonmeatman).
father(fathercarpenter, soncarpenter).

son(S, F) :- father(F, S).

same_name(fathercarpenter, soncarpenter, carpenter).
same_name(fathermeatman, sonmeatman, meatman).
same_name(fatherbaker, sonbaker, baker).

% rules:
do_job(Artisan, Job) :-
Artisan==sonmeatman,!,
artisan(Artisan),
job(Job),
Job=baker. % M.Meatman's son is baker (rule 1)

do_job(Artisan, Job) :-
Artisan==fatherbaker,!,
artisan(Artisan),
job(Job),
do_job(soncarpenter, Job). % M.Baker do M.Carpenter's son job

% not relevant...
%do_job(Artisan, Job) :-
% Artisan == soncarpenter,!,
% job(Job),
% artisan(Artisan),
% do_job(fatherbaker, Job). % rule 2 inverted

% checking if father job is not the same and name are not forgotten
do_job(Artisan, Job) :-
artisan(Artisan),
job(Job),
father(Father, Artisan),
do_job(Father, JobFather),
Job \== JobFather,
not(same_name(Artisan,_,Job)).

% checking if son job is not the same and name are not forgotten
do_job(Artisan, Job) :-
artisan(Artisan),
job(Job),
son(Artisan, Son),
do_job(Son, JobSon),
Job \== JobSon,
not(same_name(_, Artisan, Job)).

然后我试试:

swipl
?- do_job(sonmeatman, X).
X = baker ;
false.
?- do_job(fatherbaker, X).
false.

你能告诉我哪里错了吗

  • 注意:我是 Prolog 的新手。我以前从未使用过这种语言(我是 Golang、Python、C 程序员...)。
  • 注意 2:请原谅我的英文,我刚刚翻译了我的法语示例,可能工作名称或动词不正确...
  • 注意 3:我已经尝试过实现斑马拼图,我意识到这比这个更容易解决……奇怪吗?

最佳答案

你过度设计了,reifying太多的问题(典型的 Prolog 初学者错误)。你需要写的是一个六参数谓词

jobs(BakerSrJob, BakerJrJob,
CarpenterSrJob, CarpenterJrJob,
MeatmanSrJob, MeatmanJrJob) :-
...

在正文中,对这些变量的约束。例如

member(BakerJrJob, [carpenter, meatman])

表示 Baker jr。要么是木匠要么是肉人,并且

BakerJrJob \= BakerSrJob

表示贝克父子从事不同的工作。这些 member 调用和 \= 约束中的几个应该足以对所有必要的知识进行编码。 (只需在变量名称中硬编码人员的身份,而不是将名称表示和检查为原子。如果您刚刚开始,请不要尝试编写通用的解谜器。)

关于Prolog puzzle baker、meatman 和 carpenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23782129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com