Prolog 序言如何比较(>;,<;)两个字符串?

Prolog 序言如何比较(>;,<;)两个字符串?,prolog,Prolog,我在prolog中有几个事实,我想按字母顺序(按作者)显示它们。我使用这本书(书的名字,作者) 结果必须是: “一个作家”, “一些作家” 如果您不使用任何内置函数,我将非常感谢您的帮助。我所知道的获取事实并显示排序的唯一方法是制作列表,然后进行排序。SWI Prolog和ECLiPSe具有4参数排序,因此您可以执行以下操作: books_sort_by_author(Books) :- bagof(book(Title, Author), book(Title, Author), Bo

我在prolog中有几个事实,我想按字母顺序(按作者)显示它们。我使用这本书(书的名字,作者)

结果必须是: “一个作家”, “一些作家”


如果您不使用任何内置函数,我将非常感谢您的帮助。

我所知道的获取事实并显示排序的唯一方法是制作列表,然后进行排序。SWI Prolog和ECLiPSe具有4参数排序,因此您可以执行以下操作:

books_sort_by_author(Books) :-
    bagof(book(Title, Author), book(Title, Author), Books_0),
    sort(2, @=<, Books_0, Books).
我试图在没有
bagof
setof
findall
的情况下完成它,但我不知道这是怎么可能的;也许其他人能回答得更好


编辑:当然可以不创建任何列表:您可以使用
asserta
assertz
retract
对数据库事实进行排序和重新排序;但这是一个大难题,肯定不是聪明的解决方案。它也使用内置组件。

'ASome'@
成功。那是内置的。没有办法避免使用内置程序。
books_sort_by_author(Books) :-
    bagof(book(Title, Author), book(Title, Author), Books_0),
    sort(2, @=<, Books_0, Books).
books_2(Books) :-
    setof(book(Author, Title), book(Title, Author), Books).