2015-12-21 115 views
1

我有功能:Prolog的列表分裂

onlySecond([],[]). 

onlySecond([H1,H2|T1],[H2|T2]) :- onlySecond(T1,T2). 

它返回列表中的每個第二個元素。

但是我很好奇,爲什麼它沒有返回任何東西(在我看來,它必須返回[] - 空列表),當第一個參數是列表1元素。例如:

onlySecond([1],X). - not return anything.. but why it doesn't return []?? 

回答

2

你的程序有一個更大的問題:它爲奇大小的任何列表返回false。其原因是onlySecond/2中沒有任何子句可以與只包含一個項目的列表相統一 - 當您從具有奇數個項目的列表開始時,您肯定會達到該條件,因爲每個遞歸調用都會減少原始列表的長度由兩個:

  • 它不與第一條相結合,因爲[1]空列表
  • 它不與第二個子句統一的,因爲[1]具有比更少兩個項目。

爲了解決這個問題,添加一個單獨的條款來處理剛好有一個項目的列表:

onlySecond([_], []). 

加入這一條款使得奇數長的名單你的代碼的工作,以及。

Demo.

+0

謝謝!很棒! – Src