Optaplanner 课程示例,curriculumCourseScoreRules.drl 的解释

Optaplanner Curriculum example, Explanation for curriculumCourseScoreRules.drl

我正在阅读 optaplanner 的课程示例,我似乎无法理解:

rule "conflictingLecturesSameCourseInSamePeriod"
    when
        // line 1
        Lecture($leftId : id, $leftCourse : course, $period : period, period != null)
        // line 2
        Lecture(course == $leftCourse, period == $period, id > $leftId)
    then
        scoreHolder.addHardConstraintMatch(kcontext, -1);
end

问题是:
- 第 1 行中的 Lecture() 和第 2 行中的 Lecture 有什么区别?
- 我知道变量赋值发生在第 1 行,但在第 2 行,course$leftCourseperiod$period 以及 id$leftId

到目前为止,我似乎无法在文档中找到任何解释

$leftCourse : course 等绑定将 $leftCourse 建立为引用 Lecture 对象的字段 course 的变量。

第 1 行中的讲座由 id 标识;第 2 行中的一个具有更大的 ID。假设 id 值是主键,这个组合基本上匹配所有可能的无序对 Lectures,但是 ...

... 约束 course == $leftCourse 将配对限制为相同课程和 ...

...约束 period == $period 进一步将其限制为相等(非空)周期。

换句话说,计划排除了同一时期同一课程的两个不同讲座的作业。