【发布时间】:2013-08-08 16:34:50
【问题描述】:
我正在尝试编写一个执行以下操作的程序:
?- g([2,3, [22,[3],9] ,4,[5],99],X).
X= [2,3,22,[3],9 ,4,5,99]
所以它在给定列表中搜索列表,并用不带括号 [] 的元素替换它。
所以我写了这个程序:
第一个块只搜索列表中的第一个元素,即列表
如果没有这样的元素,则返回[there_is_no_list]。
first_list_in_the_list([],[there_is_no_list]):-!.
first_list_in_the_list([H|_],X):-is_list(H),X=H,!.
first_list_in_the_list([_|T],X):-first_list_in_the_list(T,X).
第一个块在 prolog 中完美运行。
第二个块只是在列表中搜索元素 X,然后将列表拆分为两个列表,一个是 X 之前的所有元素的列表,第二个是 X 之后的元素。
splite_when_find_element([H|T],H,[],T):-!.
splite_when_find_element([H|T],X,F,G):-
splite_when_find_element(T,X,F1,G),append([H],F1,F).
它在 Prolog 中也能正常工作。
第三个块是追加,它将两个列表连接在一起形成一个新列表。
append([],L,L).
append([H|T],L,[H|U1]):- append(T,L,U1).
最后一部分是:
gg(L,L):-first_list_in_the_list(L,[there_is_no_list]),!.
gg(L,U):-first_list_in_the_list(L,X),
splite_when_find_element(L,X,F,G),gg(G,R),append(F,X,E),
append(E,R,U).
当我给query [2,[3],5] 时,我也会得到[2,[3],5],我真的不明白为什么会这样。
【问题讨论】:
-
您的示例并没有删除所有子列表,但似乎只删除了中间的一个级别。例如,
[1, 2, [3, [4], 5], 6]变为[1, 2, 3, [4], 5, 6]如果我尝试按照您的示例进行操作。这是你想要的吗? -
是的,完全正确。这就是我想要的,只有一层。