私は2つのことをしようとしています。(1) 既存のリストの各要素を表示し、(2) リストを検索してその要素を含むすべての名前を表示します。
ここにいくつかの事実があります:
classes(hannes, [cs490, cs499, cs413]). % name has this list of classes
classes(tony, [ma330, ma211, ma250]).
classes(nicholas, [cs424, cs570, ma330]).
classes(pj, [ma211, ma250, ma285, cs424]).
classes(inga, [cs285, cs307, cs309]).
classes(christine, [ma285, ma211, ma330]).
classes(lisa, [cs424, cs413, cs490]).
classes(marty, [cs570, cs424]).
そして、ここまでの私のルールは次のとおりです。
taking(N,C) :- % student Name N is taking class C
classes(N,Cs),
[C|T] = Cs.
現時点では、これはリストの先頭のみを取得して表示することを知っています。リストの各項目を表示する必要があります (簡単に実行できる場合は一度に 1 行ずつ表示しますが、重要ではありません)。でも、逆もできる必要があります。1 つのコースが照会された場合 (ma330)、その特定のコースを持つすべての学生を表示したいと考えています。
クエリ例 1:
?- taking(nicholas, Classes).
Classes = [cs424, cs570, ma330] ;
また
?- taking(nicholas, Classes).
Classes = cs424 ;
Classes = cs570 ;
Classes = ma330 ;
クエリ例 2:
?- taking(Names, ma330).
Names = tony ;
Names = nicholas ;
Names = christine ;
解決策を探し続けますが、誰かが助けてくれれば幸いです。
ありがとうございました!!!