Racklog让我发疯。我不知道为什么,但是它一直在寻找重复的值。我不确定该库是否能正常工作,因为“%not”过程有时会做一些奇怪的事情,或者是我无法正确使用它。
我有一棵树,其中每个节点都有一个从1到9的唯一整数值。
我试图找到x和y的最低共同祖先,其中value(x) 顺便说一句,我试图避免使用“%or”和“%and”,因为在我以前的代码中,它们似乎创建了重复项。这就是为什么我做了一些可能不必要的谓词。 因此,对于每个返回的三元组(a b c)LCA(a,b)= c,结果都是正确的。 LCA(x,y)仅有一种可能性,并且由于x 很明显,我可以使用delete-duplicates函数,但我认为它的行为不应该如此。#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)))