web-dev-qa-db-fra.com

Opérateur Prolog "ou", requête

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?

22
Eogcloud

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

14
CapelliC

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:

Contrôle de prédicat dans Prolog

27
Robert Oschler