所以我有一套事实:
course(cs61, "intro to cs")
...
course(cs62b, "data structure")
...
grade(adam, cs61, spring11, "A")
...
grade(chrisitian, cs61, fall2010, "A-")
我需要定义谓词good_standing(Student)
,以确定Student
在每个课程中是否得到A
。我必须使用两种不同的方法:
setof/3
1日。我试图弄清楚得到Result_list
:那些从他上过的每个班级中获得A的学生。然后拨打member(Student, Result_list)
。但我不知道该怎样得到Result_list
,因为语法对我来说有点奇怪。
答案 0 :(得分:1)
1)对于NAF解决方案,你应该记住,优秀的学生是没有低于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"]).