これは、すべてのソリューションをループし、常に前のベストよりも優れたソリューションを記録するソリューションです。最終的に、最適なソリューションが返されます。
記録は を使用して行われassert/1
ます。Prolog が提供する場合 (SWI-Prolog が提供する場合)、バックトラック不可能なグローバル変数を使用することもできます。
このアプローチの利点は、各ソリューションを 1 回だけ考慮すること、つまり複雑さ 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
ミースは典型的なエストニアの猫の名前です。;)