如何在Answer Set Prolog中查看事实列表?

时间:2015-09-28 21:23:36

标签: prolog answer-set-programming

我有一些事实清单,如

student(mary).
student(john).

等,还有

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

等,

took(john,math).
...

我必须说,如果学生能够或不能毕业。

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

我认为是

can_graduate(X) :- took_all_courses(X). 

但我不知道如何解释规则所有课程没有写所有课程。有人能帮助我吗?

感谢。

2 个答案:

答案 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)。