我正在尝试编写一个执行以下操作的程序:
?- 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]
,我真的不明白为什么会这样。