Ответ 1
То, что вы действительно хотите, немного другое: вы хотите подсчитать количество ответов (до сих пор) цели.
Следующий предикат call_nth(Goal_0, Nth)
преуспевает как call(Goal_0)
, но имеет дополнительный аргумент, который указывает, что найденный ответ является n-м ответом. Это определение очень специфично для SWI или YAP. Do не используйте такие вещи, как nb_setarg/3
в ваших общих программах, но используйте их для хорошо инкапсулированных случаев как этот. Даже внутри
эти две системы, точный смысл этих конструкций недостаточно определен для общего случая. Вот определение для SICStus.
call_nth(Goal_0, C) :- State = count(0,_), % note the extra argument which remains a variable Goal_0, arg(1, State, C1), C2 is C1+1, nb_setarg(1, State, C2), C = C2.
Более эффективная абстракция предоставляется Eclipse:
call_nth(Goal_0, Nth) :-
shelf_create(counter(0), CounterRef),
call(Goal_0),
shelf_inc(CounterRef, 1),
shelf_get(CounterRef, 1, Nth).
?- call_nth(between(1,5,I),Nth). I = Nth, Nth = 1 ; I = Nth, Nth = 2 ; I = Nth, Nth = 3 ; I = Nth, Nth = 4 ; I = Nth, Nth = 5.
Так просто оберните его:
lock_open :- call_nth(conditional_combination(X), Nth), X = [8,6,5,3,6,9], !, ....