2012-12-06 2 views
0

cette requête showname volonté donne un ensemble de noms:ajouter tuple à une liste sans utiliser la bibliothèque liste pl dans Prolog

?- showName(SName,Fname). 
SName = 'McBrien', 
FName = 'Alex' ; 
SName = 'Gardner', 
FName = 'Daniel' ; 
SName = 'Phillips', 
FName = 'Abbas' ; 
SName = 'Pietzuch', 
FName = 'Paul' 

and so on as I keep pressing ; it will gives more names. 

J'ai besoin d'écrire une autre fonction appelée

nameList (List). %which will put all names by query showName into List as a tuple 
        ((SName1,FName1),(SName2,FName2), ...) 

Je veux l'essayer sans utiliser Bibliothèque Prolog (liste). Merci ..

+0

Vous pouvez ajouter tous les noms dans la liste lorsque vous les trouvez. – Fyre

Répondre

1

En supposant que votre base de données de faits est quelque chose comme

person('Alex', 'McBrien', male). 
person('Daniel', 'Gardner', male). 
person('Abbas', 'Phillips', male). 
person('Paul', 'Pietzuch', male). 

sans doublons, vous pouvez le faire sans utiliser findall/3 au moyen d'un accumulateur, bien que le coût de calcul supplémentaire. Vous devez ajouter un élément à l'accumulateur que si ce ne est pas déjà membre de celui-ci:

nameList(List):- 
    nameList([], List). 

nameList(IList, List):- 
    (
    call(person(FName, SName, _)), 
    \+ (member((SName, FName), IList)) 
)-> nameList([(SName, FName)|IList], List) ; List=IList. 

Procédure nameList/1 appelle simplement nameList/2 avec un accumulateur vide. Ensuite, la procédure nameList/2 appelle chaque personne à partir de la base de données de faits et vérifie si la personne est dans la liste des accumulateurs. Si elle trouve une telle personne, elle s'appelle récursivement en ajoutant cette personne à l'accumulateur. S'il ne trouve aucune personne qui ne figure pas dans la liste des entrées, il unifie cet accumulateur avec la liste des personnes en sortie.

+0

Merci c'est assez montre les détails, je veux comprendre prolog par ce genre de structure de données .. esprit récursivement, vous savez :) Merci pour CapelliC ainsi, sa méthode est très bonne aussi! – Yank