2013-05-07 163 views
-1

我想在Prolog中編寫一個關係分割,它需要一個整數N,整數列表L和其他參數,列表L是平的。如果列表L可以分成三個子集,則每個子集中的整數之和嚴格小於N,否則關係split將返回true。否則,該關係返回false。這是到目前爲止,我走得最遠:Swi Prolog的關係

split(list, list, list, list) 
split([],[],[],[]). 
list_sum([],0). 
split([X|L], [X|L1], [X|L2], L3):- 
list_sum([Head + Tail]), 
list_sum>N, 
!, 
split(N, L,L1, L2, L3). 

- ERROR:頂層:未定義的程序:list_sum/2(DWIM不能正確的目標) 任何幫助和解釋是高度讚賞。

+2

那不能是真正的代碼! – CapelliC 2013-05-07 05:13:58

+0

你需要走得更遠。 – 2013-05-07 06:05:36

+0

給出一些有用的建議:首先用自己的話寫下解決方案算法,並與我們分享。 – 2013-05-07 06:12:18

回答

1

基本上你的問題是你需要去學習Prolog。我不是在開玩笑。如果你認爲自己能夠逃脫這種「不理解」的等級,並且在S.O.上拿下其他等級,你將會失敗。

  1. 什麼是第一行,一條評論?將註釋字符放在那裏。
  2. 什麼是list_sum/2在您的split/4定義的中間位置?
  3. 除非你想創建某種差異列表或解構算術,否則[Head + Tail]絕對不會做你想要的。
  4. 什麼是list_sum>N應該表示在下一行? Prolog中只有一個命名空間,語言非常非常依賴於讓您的大小寫正確。由於這種馬虎,這並不是一個好兆頭。
  5. 你爲什麼在第7行切割?
  6. 當前兩個規則負責人(我認爲?)正在定義split/4時,您的最後一行是定義split/5。這不可能是你的意思。
  7. 您在第4行的模式匹配要求所有三個列表都以相同的值開始,這看起來像是一個非常特殊的特例,因爲您沒有其他可以有效檢查列表元素的特殊情況。

在我看來,這段代碼是完全無法改變的。扔掉它並重新開始。並首先閱讀教程。

1

對於您的確切問題:您有而不是定義了一個謂詞list_sum,其中包含兩個您已顯示的「代碼」中的參數。這是錯誤告訴你的。