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

Prolog 如何使displayAllValues规则递归工作并处理更新的事实,prolog,Prolog,我不熟悉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

我不熟悉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.
所以,我要做的是写下所有有最大价值的单词

我正在使用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(\uUx、Word、MaxValue):-
\+(测试(u,字1,最大值),
(Word@
写(字1),
nl
)
). 
到目前为止运气不好。有谁能帮我弄清楚如何做到这一点? 提前谢谢

提示:

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

?- listing(displayAllValues).
displayAllValues(B) :-
    \+ ( test(_, C, A),
         A<B,
         \+ writeln(C)
       ).
displayAllValues(最大值):-
forall((测试(_,Word1,Value),Value
displayAllValues(最大值):-
forall((测试(_,Word1,Value),Value请使用比
test
maxTest
displayAllValues
更具描述性的谓词名称。让
test/3
的名称反映第一个、第二个和第三个参数的含义,它们来自哪个域,以及它们之间的关系。谢谢,我下次会记住这一点。请ase使用比
test
maxTest
displayAllValues
更具描述性的谓词名称。让
test/3
的名称反映第一个、第二个和第三个参数的含义,它们来自哪个域,以及它们之间的关系。谢谢,我下次会记住这一点。谢谢@这两种方法都有效。我只是将条件更改为我想要的方式,就是这样。我非常理解“forall”。但是,对于“/+”的情况,我仍然摸不着头脑。我明白了,我们确实有\+test(),但是,为什么我们需要有'\+writeln()“。你能给我指出一个正确的地方来阅读和理解这个符号吗?我认为的SWI Prolog文档非常清楚,我想我使用的是不同版本的编译器及其NU Prolog。它不允许使用forall()。我实际上是在网上读到的,是的,很清楚。谢谢@capelical。我感谢你的帮助。谢谢@capelical两种方法都奏效了。我只是把条件改成了我想要的方式,就这样。我非常理解“forall”。但是,对于“/+”这个案例,我还是有些挠头。我得到了你,我们确实有\+测试()但是,为什么我们需要“\+writeln()”。你能给我指出一个正确的地方来阅读和理解更多关于这个符号的信息吗?我认为的SWI Prolog文档非常清楚,我想我使用的是不同版本的编译器及其NU Prolog。它不允许使用forall().我实际上是在网上读的,是的,很清楚。谢谢@capelical。我感谢你的帮助。
displayAllValues(MaxValue):-
    forall(( test(_, Word1, Value), Value < MaxValue ), writeln(Word1)).

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