如何在指定人员的PROLOG数据库中找到最高编号?

时间:2014-12-30 14:44:09

标签: 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,pages(A,N).

一旦我为findall运行查询,我得到了页数,但没有按降序排列,显示最高值,我该怎么做?

我知道以某种方式使用sumlist和/或printlist。

另外我如何在数据库中找到一些东西以'abc'或其他什么开头..我知道在sql中你有一个功能可以做到这一点,但是如何在PROLOG中完成?我想找到所有以'IEEE'开头的文章。

2 个答案:

答案 0 :(得分:1)

如果您想知道如何按升序打印列表,则只需先对其进行排序。有一个内置谓词sort/2,您可以使用它来按升序对列表进行排序。 有关详细信息,请查看SWI-Prolog文档。如果您可能不想删除重复项,请改用msort/2

您可以编写一个谓词,以这样的方式按升序获取页面:

getpages_sorted(X) :- findall(A, pages(_, A), Unsorted), sort(Unsorted, X).

为变量选择代表名称也是明智的,代码清晰度在prolog中的调试中扮演着不可或缺的角色。

答案 1 :(得分:1)

setof / 3而不是findall / 3会做,但你必须限定自由变量 scope 才能正确使用它,因为变量绑定在Prolog 执行:

getpages(X) :- setof(A,S^pages(S,A),X).

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

Prolog没有'选择......哪里......喜欢......'。符号用于标识,而在SQL(用作关系演算)中,标识是通过记录。将逻辑从关系RDBM移动到Prolog时,这是一个缺点,类似于RDBM实现的不区分大小写。一个COLLATION它不是Prolog的概念......

所以,当你问

  

如何在数据库中找到某些东西以'abc'或其他...

开头

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

page(Author, _Title) :- sub_atom(Author,_,_,_,abc).

将匹配Author atom中具有'abc'的任何页面,类似于

select Author from page where Author like '%abc%'

编辑 sub_atom / 5它相当强大:例如,用abc查看原子开始

1 ?- sub_atom(abcd,0,_,_,abc).
true.

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