0

だから私は一連の事実を持っています:

course(cs61,  "intro to cs")
...
course(cs62b, "data structure")
...
grade(adam,       cs61, spring11, "A")
...
grade(chrisitian, cs61, fall2010, "A-")

彼が受けたすべてのクラスに参加したgood_standing(Student)かどうかを判断するために、述語を定義する必要があります。私は2つの異なるアプローチを使用する必要があります:StudentA

  1. 使用するsetof/3
  2. NAFを使用する

1日。私はgetを理解しようとしましたResult_list:彼が受けたすべてのクラスからAを得た学生のセット。次に、を呼び出しますmember(Student, Result_list)Result_listしかし、構文が少し奇妙なので、何を取得すればよいかわかりません。

4

1 に答える 1

1

1)NAFソリューションの場合、優秀な学生とは、Aより低い成績のない学生、つまり、受講したコースがなく、Aより低い成績の学生であることに注意する必要があります。また、この人は少なくとも1つのコースを受講する必要があります。

good_standing(Student) :- grade(Student, _,_,_), 
                          \+ (grade(Student, Course, _, Grade), 
                              lower(Grade,"A")).

グレード間の関係を定義する下位/2の場合:

lower("A-","A").
lower("B","A").
...

上記の解決策は、学生がコースごとに1つの成績しか取得しない場合に機能します。

2)一連のソリューションについては、生徒ごとにすべての成績を見つけて、それらがAであることを確認できます。

grade(Student, Grade) :- grade(Student, _,_,Grade).
good_standing(Student) :- setof(Grade, grade(Student,Grade), ["A"]).

あるいは、falseで示唆されているように、存在記号をsetof内で明示的にすることができます。

good_standing(Student) :- setof(Grade, 
                                Course^Period^grade(Student,Course,Period,Grade),
                                ["A"]).
于 2012-04-23T20:27:44.190 に答える