Lo que realmente quieres es algo diferente: quieres contar el número de respuestas (hasta ahora) de un objetivo.
El siguiente predicado call_nth(Goal_0, Nth)
tiene éxito como call(Goal_0)
pero tiene un argumento adicional que indica que la respuesta encontrada es la n-ésima respuesta. Esta definición es altamente específica para SWI o YAP. Haga no utilice cosas como nb_setarg/3
en sus programas generales, pero úselos para casos bien encapsulados como este. Incluso dentro de los esos dos sistemas, el significado preciso de estos constructos no está bien definido para el caso general. Here is a definition for 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.
Una abstracción más robusto es proporcionada por 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.
Así que simplemente se envuelve alrededor:
lock_open :-
call_nth(conditional_combination(X), Nth),
X = [8,6,5,3,6,9],
!,
....
Veo una forma de hacer ** un agregador ** O (N) en el tiempo ** y ** espacio usando dicha primitiva. ¡Gracias! – CapelliC
Tiene que replantearse el límite/2 y la implementación offset/2, tal vez el predicado más primitivo y universal sería call_nth/2. –
No me di cuenta de que un objetivo puede llamarse así (la tercera línea del listado 'call_nth/2'). Pensé que uno siempre necesita 'call (Goal)', pero obviamente, ¡solo 'Goal' es suficiente! –