Prolog - 失败;真正

时间:2014-12-04 15:59:10

标签: prolog prolog-toplevel

我的代码存在问题。 假设我有这样的知识库:

university('University of Cambridge', 1, 'United Kingdom', 90.3, 92.8, 89.4).
university('University of Oxford', 2, 'United Kingdom', 88.9, 94.8, 88.0).
university('ETH Zurich - Swiss Federal Institute of Technology', 3, 'Switzerland', 86.4, 94.4, 92.2).
university('University of Edinburgh', 4, 'United Kingdom', 83.7, 88.8, 83.6).

然后我这样叫出来: (忽略checkC(国家)/ checkC(_))

checkC(Country):-
    university(U, R, Country, _, _, _),nl,
    write('University: '),write(U),nl,
    write('Rank: '),write(R),nl,
    write('Country: '),write(Country),nl,
    fail; true, nl,
    write('************'), nl,nl.

checkC(_):-
    write('Country not found'),nl,nl.

我的问题是,为什么如果用户输入一个不在知识库中的随机国家名称,写('未找到国家')将不会出现,我发现它与失败有关;真

任何帮助?

1 个答案:

答案 0 :(得分:2)

虽然fail; true技巧对于命令行很好,但通常通过谓词findallbagofsetof来收集多个解决方案。

为了便于阅读,我使用format

checkC(X):-
    findall( [U,R,X], university(U,R,X,_,_,_), List),
    (List = [] -> 
     write('Country not found\n\n');
     writeCountries(List)).

writeCountries([]).
writeCountries([X|R]):-
    writeCountries(R),
    format('University: ~w~nRank: ~w~nCountry: ~w~n~n',X).

如果您使用swiplmaplist就派上用场了:

checkC(X):-
    findall( [U,R,X], university(U,R,X,_,_,_), List),
    (List = [] -> 
     write('Country not found\n\n');
     maplist(format('University: ~w~nRank: ~w~nCountry: ~w~n~n'),List)).

如果您没有format/2,请查看您是否writef/2printf/2