2013-09-30 40 views
1

如何在Xs列表中第一次出現X之後添加元素EProlog插入元素第一次出現後

例子:

?- insert_right_behind(5,10,[2,4,10,12],Xs). 
Xs = [2,4,10,5,12].      % expected answer 

在這一刻,有我的理解 需要進行,因爲我是新來的語言遞歸問題。

提前致謝!

+0

如果'10'不存在,您希望它做什麼? – lurker

+0

mbratch,'false'可能 –

+0

是的,錯誤將是正確的結果,然後我猜。 – Dizeme

回答

1

使用三個謂語從句:

% Inserting after in an empty list is an empty list: 
insert_after(_X, _Y, [], []). 

% If the "after" item is at the head of the list, then the "insert" item can go after it: 
insert_after(X, Y, [Y|T], [Y,X|T]). 

% If the head of the list isn't the "after" item, then the result will be 
% this with a new tail list that has the "insert" item inserted: 
insert_after(X, Y, [H|T], [H|L]) :- 
    Y \= H, 
    insert_after(X, Y, T, L). 

如果「後,」項目沒有在給定的列表中存在,那麼insert_after/4將產生原始列表。通過刪除上面的第一個insert_after子句,它將在這種情況下失敗。

+0

謝謝,此解決方案按預期工作,並且您對答案提供了一些評論也很好。 – Dizeme

1

讓我們保持它的簡單和使用append/3maplist/2像這樣:

 
item_following_in_inserted(I,J,Xs,Ys) :- 
    append(Prefix,[J |Suffix],Xs), 
    maplist (dif (J),Prefix), 
    append (Prefix,[J,I|Suffix],Ys). 

完成!這是查詢時間...首先,讓我們運行OP給出的查詢:

 
?- item_following_in_inserted(5,10,[2,4,10,12],Xs). 
    Xs = [2,4,10,5,12]    % succeeds, but leaves behind choicepoint 
; false. 

如果該項目不是給定列表的成員,該怎麼辦?

 
?- item_following_in_inserted(5,10,[2,4, 12],Xs). 
false.        % fails, as expected: 10 is absent 

讓我們來看看,我們後的第一個發生和在其他地方只能插入!

 
?- item_following_in_inserted(5,10,[2,4,10,12,10],Xs). 
    Xs = [2,4,10,5,12,10]   % single solution 
; false.       % terminates universally 

item_following_in_inserted/4最普遍的查詢如何?

 
?- item_following_in_inserted(I,E,Xs,Ys). 
    Xs = [   E|_Z], Ys = [   E,I|_Z] 
; Xs = [  _A,E|_Z], Ys = [  _A,E,I|_Z], dif(E,_A) 
; Xs = [ _A,_B,E|_Z], Ys = [ _A,_B,E,I|_Z], dif(E,_A), dif(E,_B) 
; Xs = [_A,_B,_C,E|_Z], Ys = [_A,_B,_C,E,I|_Z], dif(E,_A), dif(E,_B), dif(E,_C) 
... 
2

previous answer最成功的查詢留下無用的選擇點。

我們可以通過使用if_/3 and (=)/3像這樣避免這些choicepoints:

item_following_in_inserted(I,J,[X|Xs],Ys0) :- 
    if_(J = X, 
     Ys0 = [J,I|Xs], 
     (Ys0 = [X|Ys], item_following_in_inserted(I,J,Xs,Ys))). 

讓我們運行一些查詢!

?- item_following_in_inserted(5,10,[2,4,12],Xs). 
false.            % OK, unchanged 

?- item_following_in_inserted(5,10,[2,4,10,12],Xs). 
Xs = [2,4,10,5,12].         % succeeds deterministically 

?- item_following_in_inserted(5,10,[2,4,10,12,10],Xs). 
Xs = [2,4,10,5,12,10].        % succeeds deterministically 

?- item_following_in_inserted(I,E,Xs,Ys). 
    Xs = [  E|_Z], Ys = [  E,I|_Z]    % OK, unchanged 
; Xs = [ _A,E|_Z], Ys = [ _A,E,I|_Z], dif(E,_A) 
; Xs = [_A,_B,E|_Z], Ys = [_A,_B,E,I|_Z], dif(E,_A), dif(E,_B) 
...