我需要定义一个谓词toAdd/3
,这样如果Xss
和Yss
是列表列表,那么toAdd(X,Xss,Yss)
如果可以通过添加获得Yss
则成立元素X
到Xss
中每个元素的末尾,例如
?- 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).
答案 0 :(得分:2)
让谓词add/3
与meta-predicate 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]].