我如何对其变量中的事实进行排序,例如
学生(5)。学生(3)。学生(2)。学生(3)。学生(6)。
我想要发挥作用,使它们出现
学生(2)。学生(3)。学生(3)。学生(5)。学生(6)。
发布于 2013-12-28 08:01:22
我首先使用findall (例如:如何根据Prolog中的事实创建列表?)将所有这些事实收集到一个列表中,然后对这个列表进行排序(例如:在Prolog中对列表进行排序,或者只使用内置的sort/2谓词)。
(从我的手机发送)
发布于 2013-12-28 08:08:15
目前,它们不是正确的Prolog中的事实,您需要用小写字母来写它们:
student(5).
student(3).
% etc
然后,你可以做几件事:
?- findall(S, student(S), Students), msort(Students, Sorted).
(如另一答复所述)
如果希望在数据库中对它们进行实际排序,并且不害怕在运行时更改数据库,则可以使用abolish/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))
).
反复这样做并不是个好主意!如果您有一个经常变化的学生数据库,您可以考虑不将它们放在数据库中,而是使用例如图书馆(助理图书馆)中的关联列表。
https://stackoverflow.com/questions/20812230
复制相似问题