0

所以我有一组事实:

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

我需要定义一个谓词good_standing(Student)来确定他是否参加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 的学生。我们还要求此人至少参加一门课程。

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

低/2 定义等级之间的关系:

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

如果学生每门课程只获得一个成绩,则上述解决方案有效。

2) 对于 setof 解决方案,您可以找到每个学生的所有成绩并检查它们是否为 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 回答