2016-11-22 45 views
0

說我有一個列表從一個元素以列表中的序言

​​

,我想借此從列表中的頭去,但返回列表的其餘部分

這樣:-3

[2,4,6,9] 

-2

[3,4,6,9] 

然後我想移動到下一個元素等等,

-3

[5,1,6,9], 

-2

[5,2,6,9] 

我怎麼能爲這種一個序言謂詞,

到目前爲止我有

change([],[]). 
change([Head|Tail], [Head1|Tail]):- 
    process(Head, Head1). 


process([],[]). 
process(Head, Head1):- 
    Head1 is Head-3, 
    Head1 >=0. 

process(Head, Head1):- 
    Head1 is Head-2, 
    Head1 >=0. 

我不確定我會在我的遞歸調用返回, 任何幫助將是巨大的謝謝

+0

你想改變只有頭和第二元素並保留其他列表,它是什麼?而且你只想用-2,-3或者給定的數字來做到這一點? – coder

+0

我想從列表中的每個元素中分別刪除-2和-3 @coder – user3667111

+0

但是在你的例子中輸入[5,4,6,9]應該是什麼樣的? (你描述了一些變化,但準確的預期輸出是什麼??) – coder

回答

2

你的代碼是當前寫入它試圖在給定的解決方案來改變多個列表元素的方法。但是,該要求似乎只是更改一個列表元素。使用CLP(FD)將有助於算術。

change([], []).   % Nothing to change 
change([X|T], [Y|T]) :- % Change only the head 
    Y #= X - 2 ; Y #= X - 3. 
change([X|Xs], [X|Ys]) :- % Keep the head and change something later 
    change(Xs, Ys). 

這個解決方案的潛在問題是,它change(L, L).是真實的清單(不改變)。爲了避免這種情況,你可以改變基本情況是爲單元素列表,並迫使其他人有兩個要素:

change([X], [Y]) :-    % Change only the last or single element 
    Y #= X - 2 ; Y #= X - 3. 
change([X,X1|Xs], [Y,X1|Xs]) :- % Change only the head 
    Y #= X - 2 ; Y #= X - 3. 
change([X,X1|Xs], [X,Y1|Ys]) :- % Keep the head and change something later 
    change([X1|Xs], [Y1|Ys]). 
+0

這是避免此問題的常見修復方法;通過添加額外的元素?\ – user3667111

+0

@ user3667111添加額外的元素是一種強制列表邏輯中的2個或更多元素的方式。我不希望第二個或第三個子句匹配單個元素列表。我只想要第一個子句匹配單個元素列表。 – lurker

+0

好的,謝謝。另外我知道這可能是微不足道的,但爲什麼把'(Y是X - 2; Y是X - 3)'括號括起來? – user3667111

相關問題