Comment créer une variable globale dans le prologue
J'ai une liste que j'ai créer comme suit:
tab([(top,left),(top,middle),(top,right),(center,left),(center,middle),
(center,right),(bottom,left),(bottom,middle),(bottom,right)]).
Je souhaite créer une variable globale AllPosition qui est un onglet. J'ai donc fait la suivante:
tab(AllPos).
Est-ce exact?
Puis-je suivre problème:
J'ai une fonction qui reçoit l'un de la paire dans le tab. Que je souhaite supprimer. J'ai donc fait ceci:
place(Line, Column, Tab) :-
AllPos \== [_,_] /*while AllPos isn't empty - not sur if this is done this way*/-> (member((Line,Column), AllPos) -> (erase(AllPos, (Line,Column), AllPos)).
où erase(List, Element, NewList)
efface l'élément Élément de la Liste et crée une nouvelle liste NewList égale à la Liste, mais sans Élément. Les deux fonctions member
et erase
de travail.
La chose est... Comme vous l'avez peut être remarqué que j'ai utiliser AllPos
partout. C'est parce que je veux, je veux le modifier pour que je puisse l'utiliser plus tard (après avoir supprimé certains éléments de celui-ci), dans une autre fonction. Est ma logique à droite? Vais-je être en mesure d'utiliser la modification de AllPos dans une autre fonction?
Grâce
OriginalL'auteur FriedRike | 2012-05-18
Vous devez vous connecter pour publier un commentaire.
En SWI-Prolog, vous pouvez utiliser:
b_setval(name, value)
etb_getval(name, value)
. Et dans le cas où vous ne voulez pas que la modification des valeurs de retour en cas de retour en arrière, vous pouvez vous rendre effectif global en utilisant:nb_setval(name, value)
etnb_getval(name, value)
.Ainsi, par exemple, si vous avez un programme et que vous voulez vérifier combien de fois il est passé par un certain chemin, vous pouvez utiliser:
Ce qui est bon pour certains expérimentale cas, mais en général, vous voulez éviter les variables globales dans le Prologue car Prologue de moyens de programmation en logique.
OriginalL'auteur Yeti
l'ajout de Ian réponse:
à l'aide généralement d'affirmer/rétractation est lente. de nombreux prolog implémentations ont des moyens plus efficaces pour mutable variables globales (par exemple vérifier swi-prolog est lib )
maintenant, si vous voulez un immuable variable globale qui peut être codé presque comme vous l'avez fait;
vous "déclarer" comme
myvar(42).
mais pour l'utiliser, vous devez faire ceci:de nouveau, en utilisant mutable variables globales n'est pas vraiment suggéré et peut conduire à de très, très mauvais et difficile à détecter les bugs en raison de mandature.
cheers, fixe!
OriginalL'auteur Thanos Tintinidis
En bref: non, votre logique n'est pas correct. Il y a divers petits problèmes et bugs avec votre code, mais le problème le plus important est le principe de base. On dirait que vous êtes en train de penser le problème dans le mauvais sens. En général, si vous essayez de mettre à jour l'état global dans un Prologue de programme, vous devez repenser votre conception. L'état y est plus généralement porté par les arguments de prédicats, alors plutôt que de fédérateur
AllTabs
dans le corps deplace/4
, je me serais attendu à l'ensemble des courantsTabs
être passé en argument.Si vous vraiment souhaitez mettre à jour l'état global de votre programme, alors vous devez regarder à la
assert
etretract
prédicats.Quelques points particuliers:
il déclare un prédicat avec un unbound variable dans la tête. Il est plus ou moins vide de sens (vous avez pu lire est "il est le cas que
tab
est vrai de quelque chose, mais nous n'avons aucune information sur ce que c'est vrai").Cette utilisation de
AllPos
est dans une autre étendue detab/1
, donc à part le partage d'une même séquence de caractères dans le nom de la variable, les deux usages deAllPos
n'ont pas de relation du tout.OriginalL'auteur Ian Dickinson