Prolog查询以查找数据库中最大的元素?
如果我已经定义了Prolog数据库中的所有数字,例如Prolog查询以查找数据库中最大的元素?,prolog,Prolog,如果我已经定义了Prolog数据库中的所有数字,例如dig(0),dig(1),…,dig(9)。Prolog可以使用什么查询来返回最大的数字——在本例中是9 我试过这样的方法: ?- dig(N), dig(M), N > M. largest(N):- dig(N), not(( dig(M), M > N )). 但这只是返回第一种可能性,而不是最大的数字。要找到最大的数字,您应该编写一个适当的查询,即: 例示一个数
dig(0),dig(1),…,dig(9)
。Prolog可以使用什么查询来返回最大的数字——在本例中是9
我试过这样的方法:
?- dig(N), dig(M), N > M.
largest(N):-
dig(N),
not((
dig(M),
M > N
)).
但这只是返回第一种可能性,而不是最大的数字。要找到最大的数字,您应该编写一个适当的查询,即:
- 例示一个数字
- 检查该数字是否最大(即没有其他数字更大)
?- dig(N), dig(M), N > M.
largest(N):-
dig(N),
not((
dig(M),
M > N
)).
而最短的解决方案可能是:
?- dig(Max), \+((dig(X), X > Max)).
概念上最简单的解决方案可能是:
?- findall(X, dig(X), Digits), max_list(Digits, Max).
但是,请查看更多的解决方案,其复杂性有好有坏
您可以通过查阅以下文件来测试这两种解决方案的速度:
:- between(1, 12345, X), assert(dig(X)), fail ; true.
:- time((findall(X, dig(X), Digits), max_list(Digits, Max))),
write('Findall max: '), write(Max), nl.
:- time((dig(Max), \+((dig(X), X > Max)))), write('\\+ max: '), write(Max), nl.
在我5岁的笔记本电脑上,它清楚地表明,如果数据库中有12345个条目,那么findall
-版本的速度要快得多
% 37,085 inferences, 0.05 CPU in 0.06 seconds (87% CPU, 741700 Lips)
Findall max: 12345
% 76,230,375 inferences, 60.94 CPU in 72.30 seconds (84% CPU, 1250909 Lips)
\+ max: 12345
这是可行的,但复杂度很低,即O(n^2)。可以在O(n)中执行此查询。重复:的可能重复