我正在编写一个顾问程序,为学生选择下一个学期的课程。其中一项任务是检查学生是否具备所有先决条件。到目前为止,我有:测试以查看列表/变量的所有元素是否为真
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]).
哪有我建立了系统,以便需要其他类的类正常工作?
一些建议:'prereq/2':将所有必需的类放入列表中。即使只有一个。即使没有 - 这将是一个空的列表。 – false
与我现在正在做的事情相比,这会是一个优势吗? (另外,很好的用户名,特别是对于Prolog的问题。) – SomeKittens
它会更统一(不再有特殊的外壳) - 它可以顺利地解决你的问题,并且可以替代先决条件。 – false