我有一些事实清单,如
student(mary).
student(john).
等,还有
course(math).
course(a).
course(b).
等,
took(john,math).
...
我必须说,如果学生能够或不能毕业。
要毕业,学生必须完成所有课程。但是,如果不在规则中写下所有术语,我怎么能这样说呢?
我认为是
can_graduate(X) :- took_all_courses(X).
但我不知道如何解释规则所有课程没有写所有课程。有人能帮助我吗?
感谢。
答案 0 :(得分:0)
took_all_courses(Student) :-
student(Student),
forall( course(C), took(Student,C) ).
答案 1 :(得分: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.
我没有测试过,但是这应该有效,你可能需要根据你使用的地图的版本来使用聚合的语法(例如,参见Clingo 3 vs 4)。