Prolog Jobs拼图

时间:2016-07-20 04:37:51

标签: prolog zebra-puzzle

< p>我是prolog的新手,必须完成这项任务。 我对如何与我所拥有的事实以及我自己做出的结论建立关系感到非常困惑。 在此问题的代码部分,您将找到给定信息的列表以及我从数据中得出的结论。 如果我能够在正确的方向上被引导以完成我的任务,我将不胜感激。 提前谢谢!< / p> <预><代码> %有三个人:约翰,吉姆和玛丽,每人都有两份工作。    这些工作是园丁,兽医的助手,洗碗机,护士,    %高中数学老师和生物学导师。    %您将获得以下信息:    %1)护士昨晚和兽医助理一起出去了。    %2)玛丽是生物学导师的朋友,但她昨晚待在家里。    %3)吉姆喜欢动物,但他没有数学,不得不辍学。    %4)吉姆不认识园丁。    %5)玛丽和生物学导师曾经结婚。    我的事实结论:    %6)玛丽不是生物学导师,因为她没有参加    %biologyTutor和她嫁给了生物学导师(2& 5)    %7)吉姆不是高学历的教师,因为他的数学不及格(3)    %8)吉姆不是园丁,因为他不认识园丁(4)    %9)Mary不是护士/兽医助理,因为她没有出去(1& 2)    %10)生物学导师昨晚出去了(1& 2)    谁拥有哪些工作?包括解释您的策略的报告。    %Exepcted Answers:    %Mary:园丁,highSchoolMathTeacher    %Jim:vetAssistant,dishWasher    约翰:护士,生物学导师    %Given Information,又名FACTS:    %的人(姓名)。    人(玛丽)。    人(吉姆)。    人(约翰)。    %的工作(作业名)。    工作(园丁)。    作业(vetAssistant)。    作业(洗碗机)。    工作(护士)。    作业(highSchoolMathTeacher)。    作业(biologyTutor)。    went_Out(护士,vetAssistant)。    朋友(玛丽,biologyTutor)。    喜欢(吉姆,动物)。    未知(吉姆,园丁)。    离异(玛丽,biologyTutor)。 < /代码>< /预> < p>对原始问题的更新:< / p> < p>所以我在这里得到了一个非常奇怪的错误:< / p> < pre>< code>%人员列表 人(玛丽)。 人(吉姆)。 人(约翰)。 %职位列表 工作(园丁)。 作业(vetAssistant)。 作业(洗碗机)。 工作(护士)。 作业(highSchoolMathTeacher)。 作业(biologyTutor)。 变量的百分比长度为2& %解决方案是人和相应的变量 长度(MaryJobs,2), 长度(JimJobs,2), 长度(JohnJobs,2), 解决方案= [mary-MaryJobs,jim-JimJobs,john-JohnJobs], %query查找作业AllJobs是一个包含作业变量的列表 的findAll(作业,作业(作业),AllJobs) AllJobs = [Gardener,VetAssistant,DishWasher,Nurse,MathTeacher,BioTutor], %注意:我不确定是否扁平化 弄平([MaryJobs,JimJobs,JohnJobs],职位), 置换(乔布斯AllJobs) %6& 9;玛丽不是护士,VetAssistant或BioTutor \ +成员(护士,MaryJobs), \ +成员(VetAssistant,MaryJobs), \ +成员(BioTutor,MaryJobs), %7& 8& 3; Jim不是MathTeacher或Gardener \ +成员(MathTeacher,JimJobs), \ +成员(Gardener,JimJobs), 玛丽是园丁,因为吉姆不知道 %Gardener,因此他不能和园丁一起出去。 \ +成员(Gardener,JohnJobs), 吉姆一定不认识玛丽,因为她是园丁 约翰和玛丽必定已经结婚了 %结论:Jim不是Bio Tutor \ +成员(BioTutor,JimJobs), 逻辑上,因为吉姆喜欢动物,所以如果他有意义的话 %是VetAssistant,因为这是真的,John是护士 \ +成员(VetAssistant,JohnJobs), \ +成员(护士,JimJobs), 自从大学退出大学以来,逻辑上是合理的,这是有道理的 %,如果他是洗碗机 \ +成员(DishWasher,MaryJobs), \ +成员(DishWasher,JohnJobs)。 %自动这应该得出结论Mary是MathTeacher < /代码>< /预> < p>如果我取出逗号并用句点替换,我会收到错误。 主要错误在于包含代码:< / p> <预><代码>长度(MaryJobs,2), 长度(JimJobs,2), 长度(JohnJobs,2), 解决方案= [mary-MaryJobs,jim-JimJobs,john-JohnJobs], < /代码>< /预> < p>我收到的错误讯息是:< / p> <预><代码>警告:/ Users / KaitlynChait / Desktop / School / CCNY / Summer 2016 / Artificial Intelligence / CSC448_program_2 / program2.pl:16: 单例变量:[解决方案,工作] 错误:/ Users / KaitlynChait / Desktop / School / CCNY / 2016年夏季/人工智能/ CSC448_program_2 / program2.pl:16: 完全停止在子句体中?无法重新定义,/ 2 %/ Users / KaitlynChait / Desktop / School / CCNY / Summer 2016 / Artificial Intelligence / CSC448_program_2 / program2.pl编译0.00秒,9条款 1? - < /代码>< /预>

1 个答案:

答案 0 :(得分:0)

由于这是一个你必须解释你的工作流程的任务,我不会提供完整的工作代码,而是提供一些想法和指示如何解决这个问题。

<强> MODEL

您将需要一个代表解决方案的模型,以这种方式创建,您可以轻松访问所需的变量。举个例子:

length(MaryJobs,2),
length(JimJobs,2),
length(JohnJobs,2),
Solution = [mary-MaryJobs,jim-JimJobs,john-JohnJobs]

现在我们有3个变量分别代表玛丽,吉姆和约翰的两个职位。

其次,我们需要使用可用的工作事实来与他们合作,所以我们在以下方面做了一些事情:

findall(Job,job(Job),AllJobs),
AllJobs = [Gardener,VetAssistant,DishWasher,Nurse,MathTeacher,BioTutor].

此时我们拥有有关模型的所有必要信息,我们可以编写模型与所有可用作业之间的关系,如下所示:

flatten([MaryJobs,JimJobs,JohnJobs],Jobs),
permutation(Jobs,AllJobs)

请注意,在此行中,Prolog将开始在不同选项之间进行分支。

<强>规则

你已经在你的问题中用英语写出了大部分规则,所以真正有的就是把它们翻译成Prolog。我们来看一个例子:

“VetAssistant和护士+玛丽没出去就出去了。”

这隐含地说,正如你所说:“玛丽不能成为护士,也不能成为兽医助理”

所以,只需在代码中:

\+ member(Nurse,MaryJobs),
\+ member(VetAssistant,MaryJobs)

如果你遵循这些思路并将你的每一条英语规则翻译成Prolog代码,你可能最终会得到一些解决方案(就像我自己一样)。为了获得最终结果,还有一个你尚未提及的“隐藏”隐含规则。我可以在这里写下来,但也许你应该先尝试先行,毕竟,这很有趣。

祝你好运!