このディレクトリの索引
#  So  I have a set of facts:
#  
#  course(cs61,  "intro to cs")
#  ...
#  course(cs62b, "data structure")
#  ...
#  grade(adam,       cs61, spring11, "A")
#  ...
#  grade(chrisitian, cs61, fall2010, "A-")
I need to define a predicate good_standing(Student) to determine whether the Student got A in every class he took. I must use 2 different approaches:
#  
#  use setof/3
#  use NAF
#  on the 1st. I have tried to figure out get Result_list: the set of students that got A from every class he took. and then call member(Student, Result_list). But I don't know what to get the Result_list since the syntax is a bit strange to me.

'科目の全てを受講し、かつ成績がAの者'(_氏名) :-
        findsetof(_氏名,(
                    成績(_氏名,_,_,_)),
                _氏名ならび),
        findsetof(_科目,
                    科目(_科目,_)),
                _科目ならび),
        member(_氏名,_氏名ならび),
        受講した科目と成績(_氏名,_受講した科目ならび,_成績ならび),
        \+(受講していない科目がある(_受講した科目ならび)),
        all(_成績ならび,'A').

受講した科目と成績(_氏名,_受講した科目ならび,_成績ならび) :-
        findall(_科目,(
                    成績(_氏名,_科目,_成績)),
                _受講した科目ならび),
        findall(_成績,(
                    成績(_氏名,_科目,_成績)),
                _成績ならび).

受講していない科目がある(_受講した科目ならび,_科目ならび) :-
        member(_科目,_科目ならび),
        \+(member(_科目,_受講した科目ならび)).

all([],_).
all([V|R],V) :-
        all(R,V).