如何使我的 displayAllValues 规则递归工作并处理更新的事实

How can I make my displayAllValues rule to work recursively and deal with updated facts

我是 Prolog 的新手,在尝试使我的代码本质上递归时遇到了挑战,因此,如果我决定将新事实添加到我的字典中,它应该能够产生所需的结果。 而且,我想在不使用任何预定义函数的情况下做到这一点

这是我的场景:

% some test facts
test(1,one,10).
test(2,two,60).
test(3,three,20).
test(4,four,60).
test(5,five,30).
test(6,six,60).

maxTest(_) :-
    test(_, Word, MaxValue), 
    \+ (test( _ , _ , Value), Value > MaxValue), 
    write(Word), 
    nl, 
    displayAllValues(Word, MaxValue).

displayAllValues(Word, MaxValue):-
     hr(_, Word1, MaxWins),
     hr(_, Word2, MaxWins),
     Word1 @< Word,
     Word2 @< Word1,
     write(Word1),
     nl,
     write(Word2),
     nl.

所以,现在代码给了我这个输出:

?- maxTest(Result).
two
four
six
R = R

所以,我要做的是写出所有具有最大值的单词。

我正在使用 NU Prolog 1.3。但是,我清楚地知道,如果我添加新的事实,我的代码将不会相应地工作,

test(7,seven,60).

所以,我希望我的代码输出的是这样的,

?- maxTest(Result).
    two
    four
    six
    seven
    R = R

我试图通过做这样的事情来实现这一点,例如,

displayAllValues(_, Word, MaxValue):-
    \+ (test( _ , Word1, MaxValue),
        (   Word @<  Word1 ->
            write(Word1),
            nl
        )
      ). 

到目前为止运气不好。谁能帮我弄清楚如何实现这一目标? 提前致谢!

提示:

displayAllValues(MaxValue):-
    forall(( test(_, Word1, Value), Value < MaxValue ), writeln(Word1)).

?- listing(displayAllValues).
displayAllValues(B) :-
    \+ ( test(_, C, A),
         A<B,
         \+ writeln(C)
       ).

forall(Condition, Action) 翻译为 listing/1.