2008-12-18 125 views
0

我有功能Prolog - 輸出列表?

sublist(_,[_],_) :- 
    !. 
sublist(X,[Y|T],Z) :- 
    R is X - Y, 
    sublist(X,T,[R|Z]). 

的示例性呼叫是sublist(2,[1,2,3],Z)。 在執行結束,它只是給了我「是」,但我想看到Z.

的內容,我知道這是一些簡單的,因爲我有做類似的事情其他指令,但是這一個ISN」不工作。

+0

請指定謂詞應該做什麼。另外,請格式化您的代碼,以便閱讀更容易。 – Kaarel 2008-12-18 20:11:09

回答

1

你真的不指定哪些sublist/3是應該做的,但也許你的意思是這樣的:

sublist(_, [], []) :- !. 

sublist(X, [Y | T], [R | Z]) :- 
    R is X - Y, 
    sublist(X, T, Z). 

用例:

?- sublist(2, [1, 2, 3], Z). 
Z = [1, 0, -1]. 

順便說一句,如果你不想遍歷您可以使用由SWI-Prolog提供的maplist/3。首先定義所需的計算:

my_calculation(X, Y, Z) :- 
    Z is X - Y. 

,然後調用maplist/3

?- maplist(my_calculation(2), [1, 2, 3], Z). 
Z = [1, 0, -1]. 
3

我也要去假設子列表/ 3應該減去列表中的所有項目數量。

你沒有得到任何結果的原因是因爲你正在建立列表的方式進入遞歸。這意味着,當停止謂詞成功時,Prolog就會返回到遞歸之外,並且Z再次變得沒有實際意義。

Z is ? 
    | 
    Z is [-1] 
     | 
     Z is [-1, 0] 
      | 
      Z is [-1, 0, 1] 
      | 
     Z is [-1, 0] 
     | 
    Z is [-1] 
    | 
Z is ? 

嘗試先進入遞歸併在出路上構建您的列表。也許是這樣的:

subtract_list(_, [], []). 

subtract_list(Number, [Head|Tail], [Subtracted|Result]):- 
    subtract_list(Number, Tail, Result), 
    Subtracted is Head - Number. 

我們所做的一切都是遞歸謂詞中的規則順序和停止條件的條件。現在,它會遞歸直到它到達一個空列表,此時它也將實例化帶有空列表的結果變量。然後它會重新爲列表添加值,因爲它這樣做。

?- subtract_list(1,[4,3,2],Z). 
Z = [3, 2, 1] 

希望這會有所幫助。 Tom