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

时间:2015-10-28 05:08:47

标签: 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, 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
        )
      ). 

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

1 个答案:

答案 0 :(得分:0)

提示:

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

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

forall(条件,行动)如清单/ 1所示进行翻译。