Насколько я понимаю, call_nth (: Goal,? Nth) возвращает N-е решение цели, но в то же время тайно вычисляет все предыдущие решения (от 1-го до (N-1) -го) и просто игнорирует их.,Если мы хотим сравнить X-е с (X + 1) -ым решением для каждого X между 1 и N-1, call_nth становится очень дорогостоящим, потому что он в основном продолжает вычислять решения, которые уже были вычислены на предыдущих этапах.Мне было интересно, если есть более эффективный способ решения проблем этой формы, без использования findall / 3, конечно.
(Типичным примером этого будет сценарий ниже, который находит ЦЕЛЬ или ближайшиймаксимум, если цель не существует в предикатах.)
num(10).
num(20).
num(30).
num(40).
num(50).
search_for_goal(GOAL,RESULT):-
search_for_goal(GOAL,0,1,RESULT).
search_for_goal(GOAL,_,COUNTER,GOAL):-
call_nth(num(GOAL),COUNTER),!.
search_for_goal(GOAL,CURRENT_MAX,COUNTER,RESULT):-
call_nth(num(X),COUNTER),
COUNTER2 is COUNTER+1,
( X=<CURRENT_MAX->
search_for_goal(GOAL,CURRENT_MAX,COUNTER2,RESULT)
; search_for_goal(GOAL,X,COUNTER2,RESULT)
).
search_for_goal(_,CURRENT_MAX,COUNTER,CURRENT_MAX):-
\+call_nth(num(_),COUNTER).