我正在努力学习Prolog。我想写一个谓词,它会放置气泡'在列表中的每个原子之前。空列表不变。
?-addbubbles([a,b,8,c],X).
X=[bubbles,a,bubbles,b,8,bubbles,c]
我写了以下代码:
Addbubbles([],[]).
addbubbles([H|T],[A|B]) :-append([bubbles],[H],A),addbubbles(T,B).
但输出并不像预期的那样:
?- addbubbles([a,v,2,4,f],M).
M = [[bubbles,a], [bubbles,v], [bubbles,2], [bubbles,4], [bubbles,f]] ;
如何删除额外的括号,以便输出为:
M = [bubbles,a, bubbles,v,bubbles,2,bubbles,4,bubbles,f];
答案 0 :(得分:1)
您不需要在此处使用append/3
。只需逐字记下规范:
% The empty list is left alone:
addbubbles([], []).
% Add 'bubbles' before each element in the list (recursively):
addbubbles([Element|OldTail], [bubbles,Element|NewTail]) :-
addbubbles(OldTail, NewTail).
列表的格式为[Element1, Element2, Element3… | Tail]
。因此,您可以使用[bubbles,Element|NewTail]
添加两个元素。
它有效:
?- addbubbles([a,b,8,c],X).
X = [bubbles, a, bubbles, b, bubbles, 8, bubbles, c].
?- addbubbles(X, [bubbles, a, bubbles, b, bubbles, 8, bubbles, c]).
X = [a, b, 8, c].
如果您想使用append/3
,则需要展平列表。 C.F. " Flatten a list in Prolog"
但请注意代码中的拼写错误。在Prolog中,你用一个点来完成子句,大写是很重要的。