Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Binary search tree: min element

Tags:

prolog

I tried to search for this but without luck; please let me know if the question has been answered!

Assuming I have a binary tree with key-value pairs of the form:

  • t/0: the empty tree
  • t/4: a tree node with t(Key, Value, Left, Right)

Now I want to get the first (min) element. The obvious (to me) implementation was:

min0(t(K,V,t,_), K, V) :- !.
min0(t(_,_,L,_), K, V) :- min0(L, K, V).

The implementation in SWI-Prolog's library(assoc) however is along the lines of:

min(t(K,V,L,_), Key, Val) :- min(L, K, V, Key, Val).
min(t,K,V,K,V).
min(t(E,K,V,_), _, _, Key, Val) :- min(L, K, V, Key, Val).

Other operations like max and get show the same difference in approach.

Why? What am I missing here? As far as I can see, my version is not creating choice points. But then again, I need a cut in the base case.


1 Answers

Your version does create a choice-point when the clauses are considered for execution. !/0 cuts the previously created choice point away. Your version does not allow indexing on the first argument but relies on a unification at a deeper place in the term. Did you already benchmark the two version on a large binary tree? Other than that, I find the SWI version more elegant because the two cases of tree terms which you mention naturally occur in it.

like image 86
mat Avatar answered Dec 08 '25 23:12

mat



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!