如何在PROLOG中从数据库中找到指定人员的最大数字?

如何在PROLOG中从数据库中找到指定人员的最大数字?,prolog,Prolog,我被指派在PROLOG上做一些工作,我在一个问题上做了一个很好的尝试,在这个问题上,我被认为可以找到某个作者的一篇文章的最大页数 到目前为止,我得到的是: A= Author P = Pages Pages(A,N) :- Database(A,_,_,_,N,_). getpages(X) :- findall(A,pages(_,A),X). getauthor(X) :- findall(A,pages(A,_),X). printlist([A|N]) :- print(A), nl

我被指派在PROLOG上做一些工作,我在一个问题上做了一个很好的尝试,在这个问题上,我被认为可以找到某个作者的一篇文章的最大页数

到目前为止,我得到的是:

A= Author
P = Pages

Pages(A,N) :- Database(A,_,_,_,N,_).
getpages(X) :- findall(A,pages(_,A),X).
getauthor(X) :- findall(A,pages(A,_),X).

printlist([A|N]) :- print(A), nl,pages(A,N).
一旦我运行findall查询,我会得到页数,但不是按降序,显示最高的值,我该怎么做

我有一个使用sumlist和/或printlist的想法


还有,我如何在数据库中找到以“abc”开头的内容。。我知道在sql中有一个函数可以实现这一点,但在PROLOG中是如何实现的?我想查找所有以“IEEE”开头的文章。

如果您想知道如何按升序打印列表,只需先对其排序即可。有一个内置谓词,
sort/2
,可用于按升序对列表进行排序。 查看文档了解详细信息。如果可能存在不希望消除的重复项,请改用
msort/2

您可以编写一个谓词,以升序获取页面,如下所示:

getpages_sorted(X) :- findall(A, pages(_, A), Unsorted), sort(Unsorted, X).
为变量选择具有代表性的名称也是明智的,代码清晰性在prolog中的调试中起着不可或缺的作用。

/3而不是findall/3会起作用,但您必须限定自由变量范围才能正确使用它,因为变量绑定在prolog执行中起着非常重要的作用:

library()将为您提供更多可供使用的构造,类似于SQL中的可用构造,但您应该首先尝试理解setof/3

Prolog没有“选择…”。。。哪里比如……’。符号用于标识,而在SQL(用作关系演算)中,标识是按记录进行的。这是将逻辑从关系型RDBMs移动到Prolog时的一个缺点,类似于RDBMs实现的大小写不敏感。这不是序言的概念

所以,当你问

如何在数据库中找到以“abc”开头的内容

例如,您应该实现自己的匹配算法

page(Author, _Title) :- sub_atom(Author,_,_,_,abc).
将匹配Author atom中具有“abc”的任何页面,类似于

select Author from page where Author like '%abc%'
编辑/5它相当强大:例如,从abc开始窥视原子


如果我想按降序找到它呢?另外,我不明白如何使用he排序(未排序,X)。这会实现从findall生成的第一个答案,然后取消对X列表的排序吗?如果需要,请按降序排序,然后反向排序
sort(Unsorted,X)
findall/3
得到的结果进行排序,当然是未排序的,X现在是您的排序列表。如果您仍然无法理解,我建议您仔细阅读关于列表和统一的prolog教程。好的,我理解必须反转列表的概念,但我不理解的是查询,我会从rev_列表运行它吗?意思是我必须将列表附加在一起?不,是这样的:
sort(未排序,已排序),reverse(已排序,已反转)
谢谢,看起来我将不得不回顾反向章节,因为我不完全理解如何在我的场景中实现它的规则。感谢您通过测试您的规则,我真的无法理解如何实现以IEEE开头的所有标题。
select Author from page where Author like '%abc%'
1 ?- sub_atom(abcd,0,_,_,abc).
true.

2 ?- sub_atom(zabcd,0,_,_,abc).
false.