这是一个循环遍历所有解决方案的解决方案,始终记录比以前最好的解决方案。最后,返回最佳解决方案。
记录是使用 完成的assert/1
,如果您的 Prolog 提供(SWI-Prolog 提供),您也可以使用不可回溯的全局变量。
这种方法的好处是每个解决方案只考虑一次,即复杂度 O(n)。因此,即使它看起来比 starblue 的解决方案丑,它也应该运行得更好。
% Data
cat(sassy, 5).
cat(misty, 3).
cat(miisu, 10).
cat(princess, 2).
% Interface
oldest_cat(Name) :-
loop_through_cats,
fetch_oldest_cat(Name).
loop_through_cats :-
cat(Name, Age),
record_cat_age(Name, Age),
fail ; true.
:- dynamic current_oldest_cat/2.
record_cat_age(Name, Age) :-
current_oldest_cat(_, CAge),
!,
Age > CAge,
retract(current_oldest_cat(_, _)),
assert(current_oldest_cat(Name, Age)).
record_cat_age(Name, Age) :-
assert(current_oldest_cat(Name, Age)).
fetch_oldest_cat(Name) :-
retract(current_oldest_cat(Name, _Age)).
使用示例:
?- oldest_cat(Name).
Name = miisu
Miisu是典型的爱沙尼亚猫名。;)