contar o número de chamadas de uma cláusula

Eu tenho uma cláusula como a seguinte:

  lock_open: -
         condicional_combinação (X),
         igual (X, [8,6,5,3,6,9]),!
         impressão (X).

esta cláusula é bem sucedida. Mas eu quero saber quantas vezes condicional_combinação () é chamada antes de equal(X,[8,6,5,3,6,9]) se tornar verdade. O programa é gerar uma permutação seguindo algumas regras. E eu preciso de quantas permutação é preciso gerar para obter um valor específico como 865369.

O que você realmente quer é algo um pouco diferente: você quer contar o número de respostas (até agora) de um objective.

O seguinte predicado call_nth(Goal_0, Nth) sucesso como call(Goal_0) mas tem um argumento adicional que indica que a resposta encontrada é a n-ésima resposta. Essa definição é altamente específica para SWI ou YAP. Não use coisas como nb_setarg/3 em seus programas gerais, mas use-as para casos bem encapsulados como este. Mesmo dentro desses dois sistemas, o significado preciso dessas construções não está bem definido para o caso geral. Aqui está uma definição para o SICStus .

 call_nth (Meta_0, C): -
    Estado = count (0, _),% nota o argumento extra que permanece uma variável
    Objetivo_0
    arg (1, estado, C1),
    C2 é C1 + 1,
    nb_setarg (1, estado, C2),
    C = C2.

Uma abstração mais robusta é fornecida pelo 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 (entre (1,5, I), Nth).
 I = Nth, Nth = 1;
 I = Nth, Nth = 2;
 I = Nth, Nth = 3;
 I = Nth, Nth = 4;
 I = Nth, Nth = 5.

Então, basta envolvê-lo:

 lock_open: -
    call_nth (condicional_combinação (X), Nth),
    X = [8,6,5,3,6,9],
    !
    ....

Se você estiver usando o prólogo SWI, poderá usar nb_getval/2 e nb_setval/2 para obter o que deseja:

 lock_open:- nb_setval(ctr, 0), % Initialize counter conditional_combination(X), nb_inc(ctr), % Increment Counter equal(X,[8,6,5,3,6,9]), % Here you can access counter value with nb_getval(ctr, Value) !, print(X). nb_inc(Key):- nb_getval(Key, Old), succ(Old, New), nb_setval(Key, New). 

Outros prólogos têm outros meios para fazer o mesmo, procurar variables ​​globais na sua implementação do prólogo. Neste trecho, usei o termo ctr para manter o contador de meta atual. Você pode usar qualquer termo que não seja usado em seu programa.