如何在Xs
列表中第一次出現X
之後添加元素E
?Prolog插入元素第一次出現後
例子:
?- insert_right_behind(5,10,[2,4,10,12],Xs).
Xs = [2,4,10,5,12]. % expected answer
在這一刻,有我的理解 需要進行,因爲我是新來的語言遞歸問題。
提前致謝!
如何在Xs
列表中第一次出現X
之後添加元素E
?Prolog插入元素第一次出現後
例子:
?- insert_right_behind(5,10,[2,4,10,12],Xs).
Xs = [2,4,10,5,12]. % expected answer
在這一刻,有我的理解 需要進行,因爲我是新來的語言遞歸問題。
提前致謝!
使用三個謂語從句:
% 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
子句,它將在這種情況下失敗。
謝謝,此解決方案按預期工作,並且您對答案提供了一些評論也很好。 – Dizeme
讓我們保持它的簡單和使用append/3
,meta-predicatemaplist/2
和prolog-dif像這樣:
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) ...
在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)
...
如果'10'不存在,您希望它做什麼? – lurker
mbratch,'false'可能 –
是的,錯誤將是正確的結果,然後我猜。 – Dizeme