setof / 3和NAF

时间:2012-04-23 19:38:18

标签: prolog prolog-setof

所以我有一套事实:

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

我需要定义谓词good_standing(Student),以确定Student在每个课程中是否得到A。我必须使用两种不同的方法:

  1. 使用setof/3
  2. 使用NAF
  3. 1日。我试图弄清楚得到Result_list:那些从他上过的每个班级中获得A的学生。然后拨打member(Student, Result_list)。但我不知道该怎样得到Result_list,因为语法对我来说有点奇怪。

1 个答案:

答案 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"]).