Racklog, это сводит меня с ума. Я не знаю почему, но он продолжает находить дубликаты значений. Я не уверен, что эта библиотека вообще работает, так как процедура "% not" иногда делает странные вещи, или я не могу использовать ее должным образом.
У меня есть дерево, где каждый узел имеет уникальное целочисленное значение от 1 до 9.
Я пытаюсь найти самый низкий общий предок х и у, где значение (х) <значение (у). </p>
Кстати, я стараюсь избегать использования "% or" и "% and", потому что в моих предыдущих кодах они, казалось, создавали дубликаты. Вот почему я сделал некоторые, вероятно, ненужные предикаты.
#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)))
Таким образом, результат в некотором роде верный, для каждой возвращаемой тройки (a b c) LCA (a, b) = c. Существует только одна возможность LCA (x, y), и, поскольку x
Очевидно, что я могу использовать функцию удаления дубликатов, но я не думаю, что она должна так себя вести.