将元素添加到子列表

时间:2014-03-28 06:51:53

标签: list prolog

我需要定义一个谓词toAdd/3,这样如果XssYss是列表列表,那么toAdd(X,Xss,Yss)如果可以通过添加获得Yss则成立元素XXss中每个元素的末尾,例如

?- toAdd(g, [[e],[b,c,f],[k,h]], Yss).
Yss = [[e,g],[b,c,f,g],[k,h,g]].         % expected result

我知道如何将一个元素添加到列表中,但列表列表让我感到困惑。

我编写的代码添加到一个列表的末尾,但没有添加到子列表。

add(X,[],[X]).
add(X,[A|L],[A|L1]) :-
   add(X,L,L1).

2 个答案:

答案 0 :(得分:2)

让谓词add/3 maplist/3一起使用!

toAdd(X,Xss,Yss) :-
   maplist(add(X),Xss,Yss).

示例查询:

?- toAdd(g, [[e],[b,c,f],[k,h]], Yss).
  Yss = [[e,g],[b,c,f,g],[k,h,g]]
; false.

答案 1 :(得分:1)

将问题分为两部分:

- transform each element
  - append to tail

然后

add(_,[],[]). % done
add(X,[E|Es],[T|Ts]) :-
  append(E,[X],T),
  add(X,Es,Ts).

我们可以使用findall / 3和member / 2

进行内联
1 ?- [user].
|: tooAdd(X, Es, Ts) :- findall(T, (member(E,Es),append(E,[X],T)), Ts).
% user://1 compiled 71.19 sec, 2 clauses
true.

2 ?- tooAdd(g, [[e], [b, c, f], [k, h]], Yss).
Yss = [[e, g], [b, c, f, g], [k, h, g]].