5

我正在尝试在 prolog 中建立一个学校调度程序。我想检查在给定时间是否有老师可以教某个课程;检查允许的时间段;等等

以下是我到目前为止能够写的内容:

teacher(ali, bio).
teacher(sara, math).
teacher(john, lit).
teacher(milton, arabic).

% a, b, c, d, e, f, g
timeslot(a).
timeslot(b).

% class has a name and a grade
class(bio, 1).
class(math, 1).
class(lit, 2).
class(arabic, 2).

如何确定一个类不能有两个时隙?

我使用了一点Prolog,但我不知道该怎么做。任何进一步的提示和指示,如更频繁解决的论文或类似问题,将不胜感激。

4

2 回答 2

4

该问题的措辞表明要编写一个程序,该程序将产生(或至少检查)建议的课程表。

该程序的输入似乎是教师列表(及其科目)、时间段列表和课程列表(及其科目/成绩)。

据推测,适当的课程表必须满足几个“基数”限制(有时称为“业务规则”)。一堂课只能教一次(不是两个时间段)是问题的重点,而且老师每个时间段只能教一堂课,等等。

如何指示这些限制?Prolog 谓词没有这种固有的限制,但它们可以在结构上或逻辑上实现(即在程序的逻辑检查中)。

以结构化方式做事的一个例子是在class谓词中添加一个字段来表示分配的时间段。该字段的分配方式将涉及一些逻辑,以确保该值是有效的时隙。

以逻辑方式处理类和时隙之间关系的一个示例是定义一个附加谓词,该谓词模拟时隙到类的分配(大概类似的东西适用于将类分配给教师)。作为说明,您将拥有 predicate class_timeslot(Class,Timeslot)。您的程序的规则将强制每个实例的这些(动态断言的)事实的一个实例的唯一性,以及Class值的有效性Timeslot

或者,代替动态事实,可以将课程表构建为类似配对课程和时隙的结构列表。但关键是程序逻辑需要实现这种配对是一种功能关系。

于 2013-08-05T14:05:44.440 回答
1

两年前,我为评估中心编写了一个调度程序,并为此使用了 clpfd,因为在正常的 swi-prolog 中它会复杂得多,而且问题是随着复杂性呈指数级缩放,所以如果你有一所真正的学校,有很多老师,课程等等,如果没有约束编程,这将不会真正有效。

请在swi-prolog 网站上查看 int clp(fd)

亲切的问候

索利克

于 2013-08-25T07:33:16.183 回答