我是prolog的新手,必须完成这项任务。我很困惑如何与我所掌握的事实和我自己得出的结论建立关系。在这个问题的代码部分,你会发现一个给定信息的列表和我从数据中得出的结论。如果我能在正确的方向上完成任务,我将不胜感激。提前感谢!
%There are three people: John, Jim, and Mary and each has two jobs.
%The jobs are gardener, veterinarian's assistant, dishwasher, nurse,
%high school math teacher, and biology tutor.
%You are given the following information:
%1) The nurse went out with the veterinarian's assistant last night.
%2) Mary is friends with the biology tutor but she stayed home last night.
%3) Jim likes animals but he failed math and had to drop out of college.
%4) Jim does not know the gardener.
%5) Mary and the biology tutor used to be married.
%My Conclusions from Facts:
%6) Mary is not the biologyTutor because she did not go out with the
% biologyTutor and she was married to the biology tutor (2&5)
%7) Jim is not the highSchoolMathTeacher because he failed math (3)
%8) Jim is not the gardener because he does not know the gardener (4)
%9) Mary is not the nurse/vetAssistant because she did not go out (1&2)
%10) The biologyTutor went out last night (1&2)
%Who holds which jobs? Include a report explaining your strategy.
%Exepcted Answers:
%Mary: gardener, highSchoolMathTeacher
%Jim: vetAssistant, dishWasher
%John: nurse, biologyTutor
%Given Information, aka FACTS:
%person(Name).
person(mary).
person(jim).
person(john).
%job(JobName).
job(gardener).
job(vetAssistant).
job(dishWasher).
job(nurse).
job(highSchoolMathTeacher).
job(biologyTutor).
went_Out(nurse,vetAssistant).
friends(mary,biologyTutor).
likes(jim,animals).
unknown(jim,gardener).
divorced(mary,biologyTutor).
原始问题的更新:
以下是我所得到的,我得到了一个非常奇怪的错误:
%list of people
person(mary).
person(jim).
person(john).
%list of jobs
job(gardener).
job(vetAssistant).
job(dishWasher).
job(nurse).
job(highSchoolMathTeacher).
job(biologyTutor).
%length of variables are 2 &
%Solution is person and corresponding variables
length(MaryJobs,2),
length(JimJobs,2),
length(JohnJobs,2),
Solution = [mary-MaryJobs,jim-JimJobs,john-JohnJobs],
%query to find the jobs AllJobs is a list containing variables of the jobs
findAll(Jobs,job(Job),AllJobs),
AllJobs = [Gardener,VetAssistant,DishWasher,Nurse,MathTeacher,BioTutor],
%Note: im not sure about flatten
flatten([MaryJobs,JimJobs,JohnJobs],Jobs),
permutation(Jobs,AllJobs),
% 6 & 9; Mary is not the Nurse, VetAssistant, or BioTutor
+ member(Nurse,MaryJobs),
+ member(VetAssistant,MaryJobs),
+ member(BioTutor, MaryJobs),
% 7 & 8 & 3 ; Jim is not the MathTeacher or Gardener
+ member(MathTeacher,JimJobs),
+ member(Gardener, JimJobs),
%Mary is the Gardener because Jim does not know the
%Gardener, therefore he cannot have gone out with the Gardener.
+ member(Gardener, JohnJobs),
%Jim must not KNOW Mary because she is the Gardener
%John and Mary must have been married
%Conclusion: Jim is not the Bio Tutor
+ member(BioTutor, JimJobs),
%logically, since Jim likes animals, it would make sense if he
%were the VetAssistant and since this is true, John is the nurse
+ member(VetAssistant, JohnJobs),
+ member(Nurse, JimJobs),
%logically since jim dropped out of college, it would make sense
%if he were to be the dishwasher
+ member(DishWasher, MaryJobs),
+ member(DishWasher, JohnJobs).
%Automatically this is should conclude that Mary is the MathTeacher
如果我去掉逗号并替换为句点,我会得到错误。主要错误在包含代码的上:
length(MaryJobs,2),
length(JimJobs,2),
length(JohnJobs,2),
Solution = [mary-MaryJobs,jim-JimJobs,john-JohnJobs],
我收到的错误信息是:
Warning: /Users/KaitlynChait/Desktop/School/CCNY/Summer 2016/Artificial Intelligence/CSC448_program_2/program2.pl:16:
Singleton variables: [Solution,Job]
ERROR: /Users/KaitlynChait/Desktop/School/CCNY/Summer 2016/Artificial Intelligence/CSC448_program_2/program2.pl:16:
Full stop in clause-body? Cannot redefine ,/2
% /Users/KaitlynChait/Desktop/School/CCNY/Summer 2016/Artificial Intelligence/CSC448_program_2/program2.pl compiled 0.00 sec, 9 clauses
1 ?-
由于这是一项必须解释工作流程的作业,我不会提供完整的工作代码,而是提供一些如何解决此问题的想法和指针。
型号
您将需要一个表示解决方案的模型,该模型的创建方式可以方便地访问所需的变量。举个例子:
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。让我们看一个例子:
"兽医助理和护士出去了+玛丽没有出去。"
这含蓄地说,正如你所说:"玛丽既不能是护士,也不能是兽医助理"
所以,简单地用代码:
+ member(Nurse,MaryJobs),
+ member(VetAssistant,MaryJobs)
如果你遵循这些思路,把你的每一条英语规则都翻译成Prolog代码,你可能会得到一些解决方案(就像我自己做的那样)。为了得到最终的结果,还有一个你还没有提到的"隐藏"隐含规则。我可以把它写在这里,但也许你应该先尝试一下,毕竟这很有趣。
祝你好运!