Racklog查找重复项

时间:2019-06-11 22:41:33

标签: racket

Racklog让我发疯。我不知道为什么,但是它一直在寻找重复的值。我不确定该库是否能正常工作,因为“%not”过程有时会做一些奇怪的事情,或者是我无法正确使用它。

我有一棵树,其中每个节点都有一个从1到9的唯一整数值​​。 我试图找到x和y的最低共同祖先,其中value(x)

顺便说一句,我试图避免使用“%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

很明显,我可以使用delete-duplicates函数,但我认为它的行为不应该如此。

0 个答案:

没有答案