我被指派在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'开头的文章。
答案 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.