2013-10-18 198 views
0

如何檢查列表中的元素是否爲空列表:[]?如何檢查列表中的元素是否爲空列表:[]?

我有以下幾點:

display_degrees([A,B,C,D]):- write(B). 

display_degrees([A,B,C,D]):- B==[], nl,write('has no degree'), nl, !. 

當我像進入:

display_degrees([1,[],3,4]). 

我只是得到:[],而不是 '有沒有學位'。我的語法錯了嗎?我不能像這樣爲這個謂詞添加一個子句嗎?

+0

@larsmans難道這是正確的方法嗎? – KKendall

回答

2

由於證明搜索在目標成功時停止,因此您會收到此行爲。當你鍵入

display_degrees([1,[],3,4]). 

第一條規則統一,它寫入B.因爲它是成功的,所以停止。你可以問Prolog繼續搜索,然後它會找到第二個子句。在swipl中,我得到了

?- [foo]. 
?- display_degrees([1,[],3,4]). 
[] 
true r % I type 'r' there 
has no degree 
true. 

如果你只是在學習Prolog,我建議你避免切割操作符!一段時間。另外,做IO並不是最直觀的事情。我會嘗試一些練習,定義諸如自然數和遞歸函數之類的東西。例如,加上:

plus(z, X, X). 
plus(s(X), Y, s(Z)) :- plus(X, Y, Z). 
1

你所擁有的問題是更一般的規則將首先觸發。你可以切換順序:

display_degrees([A,[],C,D]) :- nl, write('has no degree'), nl, !. 
display_degrees([A,B,C,D]) :- write(B). 

我也可以同樣已經爲第一個謂語寫着:

display_degrees([A,B,C,D]) :- B == [], nl, write('has no degree'), nl, !. 

但「捷徑」我告訴最初是一個Prolog的謂詞這樣更地道。

因爲你知道你決定性地想要一個選擇,當且僅當第二個列表元素是[]時,第一個規則纔會匹配。

| ?- display_degrees([1,[],3,4]). 

has no degree 

yes 
| ?- display_degrees([1,2,3,4]). 
2 

yes 
| ?- 
相關問題