2014-12-04 68 views
-1

我的代码在这里有一些问题。 比方说,我有一个知识基础是这样的:序言 - 失败; true

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. 

我的问题是为什么如果用户输入一个不在知识库内的随机国家名称,写('Country not found')不会出来,我发现它跟失败有关;真

任何帮助?

回答

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

+0

嗨,有没有办法按升序排列列表,因为现在它按降序显示。 – Huxley 2014-12-05 01:27:54

+0

当然。要么使用'sort/2'并且先排名,那么你必须在'format'调用中使用位置参数。或者写一个比较谓词并调用'predsort/3'。如果您确定子句按数据库中的排序进行排序,则还可以在'writeCountries'谓词的子句体中切换两行。 – 2014-12-05 04:31:51