Vous pouvez "invoquer" des liaisons alternatives sur Y
de cette façon :
...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).
Notez que les parenthèses sont nécessaires pour conserver le flux de contrôle d'exécution correct. Le site ;
/2 c'est le général or
opérateur. Pour votre usage restreint, vous pourriez aussi bien choisir l'opérateur plus idiomatique
...registered(X, Y), member(Y, [ct101,ct102,ct103]).
qui, en revenant sur ses pas, lie Y à chaque membre de la liste.
modifier J'ai compris avec retard votre dernière exigence. Si vous voulez que la correspondance Y todos 3 valeurs le ou n'est pas approprié, utilisez à la place
...registered(X, ct101), registered(X, ct102), registered(X, ct103).
ou le plus compact
...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]).
findall/3 construit la liste dans l'ordre même où registered/2 réussit. Ensuite, j'utilise le tri pour assurer la correspondance.
...setof(Y, registered(X, Y), [ct101,ct102,ct103]).
setof/3 trie également la liste des résultats