我有功能Prolog - 輸出列表?
sublist(_,[_],_) :-
!.
sublist(X,[Y|T],Z) :-
R is X - Y,
sublist(X,T,[R|Z]).
的示例性呼叫是sublist(2,[1,2,3],Z)
。 在執行結束,它只是給了我「是」,但我想看到Z.
的內容,我知道這是一些簡單的,因爲我有做類似的事情其他指令,但是這一個ISN」不工作。
我有功能Prolog - 輸出列表?
sublist(_,[_],_) :-
!.
sublist(X,[Y|T],Z) :-
R is X - Y,
sublist(X,T,[R|Z]).
的示例性呼叫是sublist(2,[1,2,3],Z)
。 在執行結束,它只是給了我「是」,但我想看到Z.
的內容,我知道這是一些簡單的,因爲我有做類似的事情其他指令,但是這一個ISN」不工作。
你真的不指定哪些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應該減去列表中的所有項目數量。
你沒有得到任何結果的原因是因爲你正在建立列表的方式進入遞歸。這意味着,當停止謂詞成功時,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
請指定謂詞應該做什麼。另外,請格式化您的代碼,以便閱讀更容易。 – Kaarel 2008-12-18 20:11:09