Prolog查询找到数据库中最大的元素?

时间:2010-10-29 14:31:30

标签: prolog

如果我已经定义了Prolog数据库中的所有数字,例如dig(0), dig(1), ..., dig(9)。我可以使用什么查询来为Prolog返回最大的数字 - 在这种情况下,9?

我尝试过类似的事情:

?- dig(N), dig(M), N > M.

但这只是第一种可能性,而不是最大的数字。

2 个答案:

答案 0 :(得分:1)

要查找最大数字,您应该编写一个适当的查询,即:

  • 实例化数字

  • 检查该数字是否最大(即没有其他数字更大)

所以你可能想要写一些类似的东西:

largest(N):-
    dig(N),
    not((
        dig(M),
        M > N
    )).

答案 1 :(得分:1)

虽然最短的解决方案可能是:

?- dig(Max), \+((dig(X), X > Max)).

概念上最简单的解决方案可能是:

?- findall(X, dig(X), Digits), max_list(Digits, Max).

但请查看Max out of values defined by prolog clauses以获取更多解决方案,其复杂程度越来越差。

您可以通过查阅此文件来测试这两种解决方案的速度:

:- 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岁的笔记本电脑上,它清楚地显示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 - 版本要快得多数据库中的 12345 条目。

{{1}}