1

如何E在第一次出现Xin list之后立即添加元素Xs

例子:

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

此刻,由于我是该语言的新手,因此我无法理解需要进行的递归。

提前致谢!

4

3 回答 3

2

在上一个答案中,大多数成功的查询都留下了无用的选择点。

if_/3我们可以通过使用和(=)/3这样的方式来避免这些选择点:

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)
...
于 2015-09-04T18:05:20.427 回答
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上面的第一个子句,它只会在这种情况下失败。

于 2013-09-30T18:54:02.713 回答
1

让我们保持简单,像这样使用append/3, maplist/2

item_following_in_inserted(I,J,Xs,Ys) :-
   附加(前缀,[J |后缀],Xs),
   maplist差异(J),前缀),
   附加(前缀,[J,I|后缀],Ys)。

完毕!现在是查询时间...首先,让我们运行 OP 给出的查询:

?- item_following_in_inserted( 5 , 10 ,[2,4, 10 ,12],Xs)。
  Xs = [2,4, 10 , 5 ,12] % 成功,但留下了选择点
; 错误的。

如果项目不是给定列表的成员怎么办?

?- item_following_in_inserted(5, 10 ,[2,4, 12],Xs)。
错误的。% 失败,正如预期的那样:10 不存在

让我们检查一下我们只在第一次出现之后插入——而不是其他地方!

?- item_following_in_inserted( 5 , 10 ,[2,4,10,12,10],Xs)。
  Xs = [2,4, 10 , 5 ,12,10] % 单一溶液
; 错误的。% 普遍终止

最一般的查询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]​​, 差异(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)
...
于 2015-09-04T17:50:55.517 回答