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 )). 但这只是返回第一种可能性,而不是最大的数字。要找到最大的数字,您应该编写一个适当的查询,即: 例示一个数

如果我已经定义了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(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)中执行此查询。重复:的可能重复