Was Sie eigentlich wollen, ist etwas anderes: Sie wollen die Anzahl der Antworten (bisher) eines Ziels zählen.
Das folgende Prädikat call_nth(Goal_0, Nth)
folgt wie call(Goal_0)
, hat aber ein zusätzliches Argument, das angibt, dass die gefundene Antwort die n-te Antwort ist. Diese Definition ist sehr spezifisch für SWI oder YAP. Do nicht Verwenden Sie Dinge wie nb_setarg/3
in Ihren allgemeinen Programmen, aber verwenden Sie sie für gut gekapselte Fälle als diese. Selbst innerhalb dieser beiden Systeme ist die genaue Bedeutung dieser Konstrukte für den allgemeinen Fall nicht gut definiert. 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.
Eine robustere Abstraktion Eclipse zur Verfügung gestellt:
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.
So einfach umschlingen:
lock_open :-
call_nth(conditional_combination(X), Nth),
X = [8,6,5,3,6,9],
!,
....
Ich sehe einen Weg, um einen ** Aggregator ** O (N) in Zeit ** und ** Raum mit solchen primitiven zu tun. Vielen Dank! – CapelliC
Die Implementierung limit/2 und offset/2 müssen überdenken, vielleicht wäre das primitivere und universellere Prädikat call_nth/2. –
Ich habe nicht erkannt, dass ein Ziel so genannt werden kann (die dritte Zeile der 'call_nth/2'-Auflistung). Ich dachte, man braucht immer 'call (Goal)', aber offensichtlich reicht 'Goal'! –