我是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
)
).
到目前为止没有运气。谁能帮助我弄清楚如何实现这一目标? 提前谢谢!
答案 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所示进行翻译。