如果我已经定义了Prolog数据库中的所有数字,例如dig(0), dig(1), ..., dig(9)
。我可以使用什么查询来为Prolog返回最大的数字 - 在这种情况下,9?
我尝试过类似的事情:
?- dig(N), dig(M), N > M.
但这只是第一种可能性,而不是最大的数字。
答案 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}}