2012-12-08 2 views
1

j'ai faits comme:comparant deux faits Prolog

like(sara,'data base',3). 
like(sara,'math',3). 
like(sara,'physics',3). 
like(sara,'law',3). 
like(sara,'history',5). 
like(sara,'science',1). 
like(tom,'chemistry',3). 
like(tom,'data base',2). 
like(tom,'logic',3). 
like(tom,'law',3). 
like(tom,'history',3). 
like(tom,'science',3). 
:- dynamic same_like/3. 

et je veux comparer les faits pour trouver un sujet à la fois sara et tom comme, mais avec un niveau différent, donc ce que je fais est que:

comp1 :- 
    like(sara, NofC1, X), 
    like(tom, NofC2, Y), 
    NofC1 = NofC2, 
    asserta(same_like(sara, NofC1, X)), 
    asserta(same_like(tom, NofC2, Y)), 
    same_like(sara, NC1, A), 
    same_like(tom, NC2, B), 
    NC1 = NC2, 
    A =\= B, 
    write('sara and tom like the same subject " '), 
    write(NC1), 
    write(' " .But with different level, sara= '), 
    write(A), 
    write(' And tom = '), 
    write(B), 
    nl, 
    fail. 

la réponse était bonne, mais il y a une répétition dans la réponse:

sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
sara and tom like the same subject " history " .But with different level, sara= 5 And tom = 3 
sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
sara and tom like the same subject " science " .But with different level, sara= 1 And tom = 3 
sara and tom like the same subject " history " .But with different level, sara= 5 And tom = 3 
sara and tom like the same subject " data base " .But with different level, sara= 3 And tom = 2 
false 

. La question est de savoir comment puis-je supprimer cette répétition ??? :(

Répondre

0

Vous pouvez essayer d'ajouter une coupe après avoir trouvé un match. Par exemple après la nl.

.... 
    nl, 
    !, 
    fail. 

Et qui empêche faire marche arrière au-delà de ce point. Si cela ne vous convient pas, vous pouvez expérimenter un peu l'emplacement de la coupe.

+0

je fais ça, mais si je l'utilise! pas toute la réponse sera imprimée :( – user1885169

2

Vous ne devriez pas utiliser asserta/1 sans besoin. Votre requête pourrait être beaucoup plus simple

% define a reusable query 
comp1(Argument, Person1, Level1, Person2, Level2) :- 
    like(Person1, Argument, Level1), 
    like(Person2, Argument, Level2), 
    Person1 \= Person2, Level1 > Level2. 

modifier Je changé Level1 \= Level2-Level1 > Level2 pour éviter les doublons

% use the query and display facilities 
comp1 :- 
    forall(comp1(Argument, Person1, Level1, Person2, Level2), 
      format('sara and tom like the same subject " ~s " .But with different level, ~s=~d And ~s=~d~n', [Argument, Person1, Level1, Person2, Level2])). 
+0

qui fonctionne correctement, merci beaucoup^_ ^ – user1885169