2012-06-27 8 views
1

J'ai les prédicats:prédicat d'écriture dans Prolog

  % Signature: student(ID, Name, Town , Age)/4 
     % Purpose: student table information 

     student(547457339, riki, beerSheva , 21). 
     student(567588858, ron, telAviv , 22). 
     student(343643636, vered, haifa , 23). 
     student(555858587, guy, beerSheva , 24). 
     student(769679696, smadar, telAviv , 25). 


     % Signature: study(Name, Department , Year)/3 
     % Purpose: study table information 

     study(riki, computers , a). 
     study(ron, mathematics , b). 
     study(vered, computers , c). 
     study(riki, physics , a). 
     study(smadar, mathematics , c). 
     study(guy, computers , b). 


     % Signature: place(Department ,Building, Capacity)/3 
     % Purpose: place table information 

     place(computers , alon , small). 
     place(mathematics , markus , big). 
     place(chemistry , gorovoy , big). 
     place(riki, zonenfeld , medium). 

Je dois écrire prédicat noPhysicsNorChemistryStudents(Name , Department , Year , Town)/4: trouver le nom qui apprend pas la physique ou de la chimie de tous les élèves. Je ne sais pas comment l'écrire. Je pense que ça devrait être quelque chose avec la coupe.

  % Signature: noPhysicsNorChemistryStudents(Name , Department , Year , Town)/4 

Pourquoi est-ce pas vrai? :

noPhysicsNorChemistryStudents2(Name , Department , Year , Town) :- 
    student(_, Name, Town, _), study(Name , Department , Year), 
    pred1(Name , physics , Year) , pred1(Name , chemistry , Year). 

    pred1(N,D ,Y):- study(N , D , Y) , ! , fail . 

Répondre

1

Non en Prolog a une syntaxe bizarre, sur le but de souligner que pourrait être très différent de ce que les gens attendent. Voir CWA si vous êtes intéressé.

L'opérateur est \+ et syntaxiquement il est banal: il suffit de préfixer un but avec elle pour obtenir un vrai quand ce que vous savez que but est faux, et vice-versa.

Ensuite, votre mission pouvait lire:

noPhysicsNorChemistryStudents(Name , Department , Year , Town) :- 
    student(_, Name, Town, _), 
    \+ (AnyCondition). 

Voyez si vous pouvez concevoir la formule AnyCondition, qui utilisent sûrement l'étude (Nom, Département, Année). Vous pouvez appliquer l'algèbre booléenne à factoriser:

(non A) et (non B) = non (A ou B)

modifier sous CWA, on peut utiliser négation comme un échec. C'est la façon dont Prolog implémente \ +

\+ G :- call(G), !, fail. 

ajouter à corriger

\+ G. 

devrait être clair maintenant que si le prédicat, avec \ + a permis, serait comme

noPhysicsNorChemistryStudents(Name, Department, Year, Town) :- 
    student(_, Name, Town, _), 
    study(Name, Department, Year), 
    \+ (study(Name, physics, _) ; study(Name, chemistry, _)). 

nous pouvons écrire

noPhysicsNorChemistry(Name) :- 
    (study(Name, physics, _) ; study(Name, chemistry, _)), !, fail. 
noPhysicsNorChemistry(_). 

noPhysicsNorChemistryStudents(Name, Department, Year, Town) :- 
    student(_, Name, Town, _), 
    study(Name, Department, Year), 
    noPhysicsNorChemistry(Name). 
+0

merci, mais j'ai oublié de dire que nous ne sommes pas autorisés à utiliser \ + (nous pouvons utiliser \ =, mais je ne pense pas que cela fonctionnera .. – user1479376

+0

voir mon édition, HTH, mais vous avez vraiment besoin de lire cette CWA page sur wikipedia. Surtout le [PDF] (http://www.mindswap.org/2005/OWLWorkshop/sub12.pdf) vous trouverez au fond une partie introductive qui explique simplement quel est le problème que vous devez résoudre dans votre mission – CapelliC

+0

merci..what est ment "appel (g)". Qu'est-ce que je "appelle"? – user1479376

Questions connexes