2011-09-24 2 views
1

Je suis bloqué sur un problème simple dans prolog. Considérons le programme"NOT EXISTS" dans swi-prolog

worker(bill). 
worker(smitt). 
worker(fred). 
worker(dany). 
worker(john). 
car(bmw). 
car(mazda). 
car(audi). 
owner(fred,mazda). 
owner(dany,bmw). 
owner(john,audi). 

Je dois ajouter un prédicat no_car (X), qui sera vrai si le travailleur X n'a ​​pas de voitures, à savoir si nous allons saisir une requête : - no_car (X). le Prolog devrait répondre

X=smitt, 
X=bill, 
yes 

Qu'est-ce que je l'ai fait est

hascar(X):-owner(X,_). 
    nocar(X):- worker(X),not hascar(X). 

Mais cette approche ne fonctionne pas parce que les variables sont Anonimous avaliable que pour les requêtes. Donc, je suis vraiment coincé là-dessus. Je sais qu'il y a des mots "NOT EXISTS" en SQL qui permettent d'exprimer cette logique dans une requête, mais y a-t-il quelque chose de similaire dans le prologue?

+0

votre code fonctionne si vous utilisez \ + au lieu de ne pas, il n'a rien à voir avec des variables anonymes .. –

Répondre

5

Les œuvres suivantes pour moi et fournit le résultat escompté:

no_car(W):- 
    worker(W), 
    \+ owner(W, _). 

Maintenant, c'est proche de ce que vous avez. Pour une chose, vous pouvez bien sûr utiliser _ dans les prédicats; il n'est pas limité aux requêtes. J'utilise habituellement \* pour la négation, et not me donne une erreur de syntaxe ici!?

EDIT:

Ah! Dans ma version, bien que datée, de Prolog, vous devez utiliser not(hascar(X)) pour le faire fonctionner, donc pas/1 doit être utilisé comme un terme, pas un opérateur. Mais le manuel dit aussi not est déprécié en faveur de \+.

+0

Merci! pas (hascar (X)) fonctionne bien. Cela semble étrange après avoir travaillé avec d'autres versions de prolog, je n'ai pas deviné de le vérifier. –