Prolog:用一个简单的规则求两个数之差失败且不会再重试

编程语言 2026-07-12

我在研读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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章