Racklog найти дубликаты - PullRequest
       21

Racklog найти дубликаты

0 голосов
/ 12 июня 2019

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

Очевидно, что я могу использовать функцию удаления дубликатов, но я не думаю, что она должна так себя вести.

...