我在prolog中有几个事实,我想按字母顺序显示它们(作者)。我用book(name_of_book,作者)。
book('some title', 'CSome author').
book('some title 2', 'ASome author').
结果需要: ' ASome作者', ' CSome作者'
如果您不使用任何内置功能,我将不胜感激。如果您不使用任何内置功能,那将会非常棒。
答案 0 :(得分:0)
我知道采取事实和显示排序的唯一方法是制作列表然后排序。 SWI-Prolog和显然ECLiPSe有4个参数排序,所以你可以这样做:
books_sort_by_author(Books) :-
bagof(book(Title, Author), book(Title, Author), Books_0),
sort(2, @=<, Books_0, Books).
似乎您可以改为setof
并在第一个参数中切换作者和书籍:
books_2(Books) :-
setof(book(Author, Title), book(Title, Author), Books).
我试图在没有bagof
和setof
以及findall
的情况下这样做,我不知道它是如何可能的;也许其他人可以更好地回答?
编辑:当然可以不创建任何列表:您可以使用asserta
,assertz
和retract
进行选择排序和重新排序数据库事实;但这是一个很大的黑客,肯定不是一个聪明的解决方案。它也使用内置函数。