1

私は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 ;

解決策を探し続けますが、誰かが助けてくれれば幸いです。

ありがとうございました!!!

4

1 に答える 1

1

考えてみてください: C は Classes のメンバーです。

編集OKこのコードを試してください:

taking(N,C) :-               % student Name N is taking class C
      classes(N,Cs),
      member(C, Cs).
于 2012-11-16T22:15:18.180 に答える