我正在编写一个顾问程序,为学生选择下学期的课程。其中一项任务是检查学生是否具备所有先决条件。到目前为止,我有:
hasPrereqs(Student, Class) :-
(prereq(Pre, Class) ->
hasClass(Student, Pre);
true).
hasClass(Student, Class) :-
(creditFor(Student, Class);
currentlyTaking(Student, Class)).
prereqs 声明如下:
prereq(csc140, csc145).
prereq(csc140, csc180).
prereq(csc140, csc198).
prereq([csc140, csc130], csc201).
prereq(csc145, csc201).
这适用于所有可能性,除非另一个课程需要两个课程(例如csc201
,学生可以参加 csc140 和 csc130 或仅 csc140)。我认为列表是要走的路,但我不知道如何实现它。
我尝试创建另一个hasPrereqs
如下:
hasPrereqs(Student, Class) :-
forall(prereq(Pre, Class),
(compound(Pre) ->
hasClass(Student, Pre)).
这个不起作用,因为Pre
它是一个列表,而不是一个直接的原子,因此:
creditFor(somekittens, csc130).
creditFor(somekittens, csc140).
/* Returns false, because I don't have credit for the list, just the two classes */
creditFor(somekittens, [csc130, csc140]).
如何设置系统以便需要其他几个课程的课程正常工作?