Racklog find duplicates
Racklog it's driving me crazy. I don't know why, but it keeps finding duplicate values. I'm not sure if that library even works, since "%not" procedure does some weird stuff sometimes, or it is me who just can't use it properly.
I have a tree, where each node has an unique integer value from 1 to 9. I'm trying to find Lowest Common Ancestor of x and y, where value(x) < value(y).
By the way, I'm trying to avoid using "%or" and "%and", because in my previous codes they seemed to create duplicates. That is why I made some probably unnecessary predicates.
#lang racket (require racklog) (define %parent (%rel () [('1 '2)] [('1 '4)] [('1 '8)] [('2 '3)] [('2 '9)] [('3 '5)] [('5 '6)] [('5 '7)])) (define %ancestor (%rel (x y z) [(x y) (%parent x y)] [(x z) (%parent x y) (%ancestor y z)])) (define %ancestororme (%rel (x y z) [(x x)] [(x y) (%parent x y)] [(x z) (%parent x y) (%ancestororme y z)])) (define %sibling (%rel (x y z) [(x y) (%parent z x) (%parent z y) (%/== x y)])) (define %notancestor (%rel (x y z z2) [(x y) (%ancestororme z x) (%ancestororme z2 y) (%sibling z z2)])) (define %LCA ;;LCA - Lowest Common Ancestor, LCA(x, y) =/= x and LCA(x, y) =/= y, x < y (%rel (x y slca0 slca1 lca) [(x y lca) (%notancestor x y) ;;LCA(x, y) =/= x (%notancestor y x) ;;LCA(x, y) =/= y (%< x y) (%parent lca slca0) (%parent lca slca1) (%/== slca0 slca1) (%ancestororme slca0 x) (%ancestororme slca1 y)])) (map (lambda (x) (list (cdr (first x)) (cdr (second x)) (cdr (third x)))) (%find-all (x y z) (%LCA x y z)))
So, the result is kinda correct, for each returned triple (a b c) LCA(a, b) = c. There is only one possibility of LCA(x, y), and since x < y it can't choose same x and y more than once. Yet, it still returns duplicates (eg. (2, 4, 1) appears four times).
Obviously I can use delete-duplicates function, but I don't think it should behave that way.