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).
).
Préfixe, infixe, ordre postfixe? Qu'avez-vous essayé? –