0

我有一个事实清单,例如

student(mary).
student(john).

等等,还有

course(math).
course(a).
course(b).

等等,以及

took(john,math).
...

我不得不说一个学生能不能毕业。

要毕业,学生必须完成所有课程。但是,如果不在规则中写下所有术语,我怎么能这么说呢?

我认为是

can_graduate(X) :- took_all_courses(X). 

但我不知道如何解释规则在不写所有课程的情况下参加了所有课程。有人能帮我吗?

谢谢。

4

2 回答 2

0
took_all_courses(Student) :-
  student(Student),
  forall( course(C), took(Student,C) ).
于 2015-09-28T22:42:00.610 回答
0

由于这是Answer-Set Prolog 而不是 Prolog,因此诸如 forall 之类的高阶谓词不可用。你要做的是首先计算课程的数量,其次是学生学习的课程数量。为此使用聚合怎么样?

took_all_courses(Student) :-
    student(S),
    TotalCourses = #max{C:course(C)}, CoursesTaken = #max{C:took(S,C)},
    TotalCourses == CoursesTaken.

我没有测试过,但这应该可以工作,你可能需要根据你使用的grounder版本来调整一下聚合的语法(例如,参见Clingo 3 vs 4)。

于 2015-09-30T07:11:40.203 回答