Comment puis-je retourner une liste dans le Prologue?
Disons que j'ai ces faits:
parent(bob, sam). %bob is sam's parent
parent(sara, sam). %sara is sam's parent
Je voulais savoir qui étaient sam's parents et de les renvoyer dans une liste et en tant que tel utilisés:
list_parents(P, L) :- findall(Parent, parent(Parent, P), L).
Ce que je veux faire maintenant, c'est poser la même question mais avec un seul argument en tant que tel:
findParents(sam).
J'ai essayé:
findParents(Name) :- list_parents(Name, L).
mais de cette façon, Prolog répond simplement "True"
.
Impossible. Il suffit de ne pas. Prologue de ne pas retourner à l'exception des valeurs booléennes.
OriginalL'auteur porlognewbie | 2011-05-26
Vous devez vous connecter pour publier un commentaire.
La chose avec prologue, c'est que c'est un peu différent de la plupart des langues (euphémisme, si tous les a un):
Toutes les variables sont localement étendue.
Valeurs de la Variable sont invariantes une fois lié (unifiée), à moins que les retours en arrière se délie.
Prédicats ne pas retourner une valeur dans le sens classique du terme. Qu'ils réussissent ou échouent.
Pour obtenir la valeur de retour de test d'un prédicat, vous évaluer le prédicat de le transmettre quelque chose à partir de votre prédicat. Il n'a pas d'importance si vous passez à une variable ou une valeur liée: l'appelé prédicat va réussir ou de la valeur si ce que l'appelant a unifie avec ce que vous avez passé. Si vous avez transmis une variable, et l'a appelé prédicat unifie avec une non-valeur de la variable, la variable est liée à cette valeur. Penser (un peu) comme si vous aviez un langage procédural où chaque fonction renvoyée bool et de toutes les valeurs de paramètres ont été passés par référence.
Ce que vous avez essayé de travail:
La variable L a été unifiée avec (a été lié à) la liste renvoyée par
findall/3
. Et puis il est allé hors de portée.Si vous voulez à réellement ne quelque chose avec ce qui est retourné (relié) de la valeur, vous avez besoin de traiter avec elle là où elle est dans la portée, ou d'unifier cette valeur avec quelque chose que le prédicat a été appelé avec et donc le passer en haut de la pile d'appel. Ou, vous pouvez faire valoir dans la base de données de faits et de les enregistrer pour plus tard.
La manière de prologue fonctionne est que la racine de prédicat utilisé pour démarrer votre "programme" définit un arbre de recherche en termes de prédicats dans votre base de données. Prologue de "moteur" de l'effectue ensuite une profondeur d'abord, de gauche à droite et de recherche de l'arbre. Votre prédicat réussit quand le moteur arrive à un nœud feuille de l'arbre de recherche que vous avez définis. Les retours en arrière dans votre prédicat cause le moteur de rechercher la solution suivante dans l'arbre de recherche.
En conséquence, tout ce que vous voulez accomplir de façon persistante de a à se produire comme effet secondaire de le prologue de "moteur" de l'évaluation d'un prédicat. Par exemple
print()
réussit toujours juste une fois (quand vous entrez dans la boîte)...et comme un effet secondaire imprime tout ce que vous avez demandé à imprimer. Retour en arrière dans l'impression de ne pas annuler l'impression, maisprint()
ne pas réussir à nouveau.OriginalL'auteur Nicholas Carey
vous pouvez imprimer la liste si vous voulez uniquement à l'utilisateur de le voir
quelque chose comme:
mais ce n'est pas exactement de retour. rappelez-vous, dans le prologue, il n'y a pas de fonctions, et donc pas de "valeurs de retour". vous pouvez simuler une fonction par écrit foo(Args,Retour), mais vous pouvez toujours l'appeler comme foo(X,sam) -parfois, il va donner ce que vous voulez, parfois, il le sentait, parfois, il va se planter.
eh bien, il suffit d'appeler le prédicat list_parents avec la variable à laquelle vous souhaitez stocker la liste. comme list_parents(sam,Liste). puis prolog va unifier la Liste avec la liste des les parents de sam. si cela rend plus facile que vous pouvez imaginer que c'est l'équivalent de la Liste=list_parents(sam), mais ce n'est pas tout à fait vrai.
OriginalL'auteur Thanos Tintinidis
La func bibliothèque fournit une syntaxe pour les fonctions avec les valeurs de retour en SWI-Prolog. Dans cet exemple, vous pouvez imprimer tous les parents de
sam
par écritwriteln(list_parents $ sam)
:De même, vous pouvez définir une fonction avec plusieurs paramètres comme ceci:
...et puis l'utiliser comme ceci:
OriginalL'auteur Anderson Green