2017-10-06 4 views
0

J'ai donc ce programme prologue qui imprime le nombre de nombres positifs dans un arbre.Conversion de l'arbre en liste

positive(void). 
positive(tree(L, Root, R), P) :- Root > 0, positive(L, X),positive(R, Y). 
positive(tree(L, Root, R), P) :- positive(L,X), positive(R,Y). 

Au lieu de produire le nombre de nombres positifs dans cet arbre, je veux sortir les chiffres réels dans une liste qui sont positifs

+0

Préfixe, infixe, ordre postfixe? Qu'avez-vous essayé? –

Répondre

0

Nous pouvons construire un prédicat qui transforme les éléments positifs à une liste, mais une approche plus élégante, est de construire un prédicat qui unifie avec tous les nombres positifs dans un arbre. Comme:

positive(tree(_,X,_),X) :- 
    X > 0. 
positive(tree(L,_,_),X) :- 
    positive(L,X). 
positive(tree(_,_,R),X) :- 
    positive(R,X). 

Ce préfixe est notation où nous unissons avec X comme la première des trois clauses. Dans le cas où vous voulez infixe, vous pouvez échanger le premier et deuxième prédiate. Dans le cas postfix est nécessaire, alors nous pouvons échanger la première et la troisième clause.

Maintenant, nous pouvons utiliser le méta-prédicats findall/3:

positive_list(T,L) :- 
    findall(P,positive(T,P),L). 

L'avantage de la construction d'un tel positive/2 prédicat, est que l'on peut aussi construire (en partie à la terre) des arbres qui contiennent le nombre positif (avec positive(T,3). pour instance), rectifier un arbre partiellement mis à la terre qui devrait contenir un nombre positif (comme T = tree(empty,3,_), positive(T,5).), et de plus interroger si un nombre positif est dans l'arbre (avec positive(tree(void,3,void),2).).