私は、学生が次の学期に受講するクラスを選択するアドバイザープログラムを書いています。タスクの1つは、学生がすべての前提条件を満たしているかどうかを確認することです。これまでのところ、私は持っています:
hasPrereqs(Student, Class) :-
(prereq(Pre, Class) ->
hasClass(Student, Pre);
true).
hasClass(Student, Class) :-
(creditFor(Student, Class);
currentlyTaking(Student, Class)).
前提条件は次のように宣言されています。
prereq(csc140, csc145).
prereq(csc140, csc180).
prereq(csc140, csc198).
prereq([csc140, csc130], csc201).
prereq(csc145, csc201).
これは、別のクラスに2つのクラスが必要な場合を除いて、すべての可能性で機能します(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]).
他のいくつかのクラスを必要とするクラスが正しく機能するようにシステムを設定するにはどうすればよいですか?