Prolog:用一个简单的规则求两个数之差失败且不会再重试
我在研读Sterling和 Shapiro的《The Art of Prolog》时,遇到了练习2.3.i:
添加定义关系location(Course,Building) 的规则,
busy (Lecturer,Time), and cannot-meet (Lecturer1 ,Lecturer2).
用你自己的课程事实来测试
我已经有如下相关规则:
duration(Course,Length) :- course(Course,time(Day,Start,Finish),Lecturer,Location),Start + Length = Finish.
% Course 2 concludes before or right when Course 2 concludes
cannot_meet(Lecturer1,Lecturer2) :- course(Course1,time(Day1,Start1,Finish1),Lecturer1,Location1),course(Course2,time(Day2,Start2,Finish2),Lecturer2,Location2),Finish1 >= Finish2, duration(Course2,C2Length),!, Start2 + C2Length >= Start1, Start2 + C2Length =< Finish1.
%Course 1 ends first
cannot_meet(Lecturer1,Lecturer2) :- course(Course1,time(Day1,Start1,Finish1),Lecturer1,Location1),course(Course2,time(Day2,Start2,Finish2),Lecturer2,Location2),Finish2 >= Finish1, duration(Course1,C1Length),!, Start1 + C1Length >= Start2, Start1 + C1Length =< Finish
出于某种原因,当Prolog沿谓词树向下执行时,它在 duration 调用 cannot_meet 处失败,并且不会重新尝试。是不是我误解了回溯的工作原理?它不应该一直重试,直到找到一个合适的Length以满足它吗?
解决方案
我已经发现,当我仅仅使用条件 Start + Length = Finish 时,它并不会去搜索一个能使等式成立的Length的值,而是盲目地把一个已实例化的变量加到一个未实例化的变量上,这显然会失败。相反,我应该使用 plus(Start,Length,Finish) 来得到Length的一个合适的值。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。