si puo 'richiamare' binding alternativi su Y
questo modo:
...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).
Nota la parentesi sono tenuti a mantenere il flusso di controllo corretta esecuzione. Il ;
/2 è l'operatore generale or
. Per il vostro uso limitato si potrebbe pure la scelta più idiomatica
...registered(X, Y), member(Y, [ct101,ct102,ct103]).
che il backtracking lega Y per ciascun membro della lista.
modifica Ho capito con ritardo l'ultima richiesta. Se si desidera che Y partita tutti 3 i valori delle o inadeguato, usare al posto
...registered(X, ct101), registered(X, ct102), registered(X, ct103).
o il più compatto
...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]).
findall/3 creare l'elenco nello stesso ordine che ha registrato/2 succede. Quindi uso sort per garantire la corrispondenza.
...setof(Y, registered(X, Y), [ct101,ct102,ct103]).
setof/3 smista anche la lista dei risultati
Grazie, questo ha aiutato un sacco. Non ero sicuro di come farlo, ma ho intenzione di leggere su binding e backtracking. Apprezzato! – Eogcloud