我如何查看 Answer Set Prolog 中的事实列表?
How can I go through a list of facts in Answer Set Prolog?
我有一个事实列表,例如
student(mary).
student(john).
等等,还有
course(math).
course(a).
course(b).
等,以及
took(john,math).
...
我不得不说一个学生能不能毕业。
要毕业,学生必须修完所有课程。但是,如果不在规则中写下所有术语,我怎么能这么说呢?
我认为是
can_graduate(X) :- took_all_courses(X).
但我不知道如何解释没有写所有课程的规则。有人可以帮助我吗?
谢谢。
took_all_courses(Student) :-
student(Student),
forall( course(C), took(Student,C) ).
由于这是 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)。
我有一个事实列表,例如
student(mary).
student(john).
等等,还有
course(math).
course(a).
course(b).
等,以及
took(john,math).
...
我不得不说一个学生能不能毕业。
要毕业,学生必须修完所有课程。但是,如果不在规则中写下所有术语,我怎么能这么说呢?
我认为是
can_graduate(X) :- took_all_courses(X).
但我不知道如何解释没有写所有课程的规则。有人可以帮助我吗?
谢谢。
took_all_courses(Student) :-
student(Student),
forall( course(C), took(Student,C) ).
由于这是 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)。