Je travaille sur un prologue que je suis nouveau.
Je recherche un opérateur "ou"
registered(X, Y), Y=ct101, Y=ct102, Y=ct103.
Voici ma requête. Ce que je veux écrire, c'est du code qui:
"renvoie X, étant donné que Y est égal à la valeur Z OR valeur Q OR valeur P"
Je lui demande de retourner X si Y est égal à tous les 3 cependant. Quel est l'opérateur ou ici? Est-ce qu'il y a un?
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 ;
/2 c'est l'opérateur général or
. Pour votre usage restreint, vous pouvez aussi choisir le plus idiomatique
...registered(X, Y), member(Y, [ct101,ct102,ct103]).
que le retour en arrière lie Y à chaque membre de la liste.
éditer J'ai compris avec retard votre dernière exigence. Si vous voulez que Y corresponde à toutes 3 valeurs ou est inapproprié, utilisez plutôt
...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 le même ordre que celui enregistré/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
Juste un autre point de vue. L'exécution d'un "ou" dans Prolog peut également être effectuée avec l'opérateur "disjoint" ou le point-virgule:
registered(X, Y) :-
X = ct101; X = ct102; X = ct103.
Pour une explication plus complète: