Prolog:编写现有列表的每个元素

时间:2012-11-16 20:22:41

标签: list prolog

我正在尝试做两件事。 (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门课程(ma330),我希望它显示所有具有该特定课程的学生。

查询示例1:

?- taking(nicholas, Classes).
Classes = [cs424, cs570, ma330] ;

OR

?- taking(nicholas, Classes).
Classes = cs424 ;
Classes = cs570 ;
Classes = ma330 ;

查询示例2:

?- taking(Names, ma330).
Names = tony ;
Names = nicholas ;
Names = christine ;

我将继续寻找解决方案,但如果有人可以提供帮助,我们将不胜感激。

谢谢!!!

1 个答案:

答案 0 :(得分:1)

想一想:C是Classes的成员。

编辑确定请尝试以下代码:

taking(N,C) :-               % student Name N is taking class C
      classes(N,Cs),
      member(C, Cs).