2014-12-04 40 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