在Prolog中排序事实

时间:2013-12-28 07:42:33

标签: sorting prolog

如何对变量Like

进行排序
  

学生(5)。   学生(3)。   学生(2)。   学生(3)。   学生(6)。

我想制作让它们出现的功能

  

学生(2)。   学生(3)。   学生(3)。   学生(5)。   学生(6)。

2 个答案:

答案 0 :(得分:1)

我首先使用findall(例如:How to create a list from facts in Prolog?)将所有这些事实收集到列表中,然后对此列表进行排序(例如:Sorting a list in Prolog,或者只使用内置的sort / 2谓词)。

(从我的手机发送)

答案 1 :(得分:0)

目前,他们不是正确的Prolog中的事实,你需要用小写字母写下:

student(5).
student(3).
% etc

然后,你可以做几件事:

?- findall(S, student(S), Students), msort(Students, Sorted).

(如其他答案所示)

如果您希望实际在数据库中对它们进行排序,并且不害怕在运行时更改数据库,则可以使用student/1从数据库中删除所有abolish/1并重新插入已排序的事实:

reorder_students :-
    findall(S, student(S), Students),
    msort(Students, Sorted), % do not remove duplicates
    abolish(student/1),
    forall(
        member(M, Sorted),
        assertz(student(M))
    ).

反复这样做并不是一个好主意!如果您有一个定期更改的学生数据库,您可能会考虑不将它们放在数据库中,而是使用例如library(assoc)中的关联列表