我的prolog代码有问题。我需要反转列表中的所有原子元素。
示例:[1,2,[3,4]] - > [[4,3],2,1]
我的解决方案:
myReverse([], []).
myReverse([H|T], X) :- myReverse(T, RT), myAppend(RT, H, X).
但它只给了我:[[3,4],2,1] 我想,我需要使用is_list函数和递归调用列表,如果它不是原子的...但我被卡住了......你们知道怎么写吗?
答案 0 :(得分:3)
近。考虑这个解决方案:
myReverse([], []) :- !.
myReverse([H|T], X) :-
!,
myReverse(H, NewH),
myReverse(T, NewT),
append(NewT, [NewH], X).
myReverse(X, X).
第一个子句是基本案例,其中包括一个剪切(!
),用于排除由于最后一个子句而留下的选择。
第二个子句反转头部H
,它可以是原子或列表。如果H
是一个原子,则切割后的递归子目标使用最后一个子句进行求值,并且原子通过不变。如果H
是一个列表,则使用第二个子句对其进行求值,并反转所有元素。下一个子目标对列表的其余部分(尾部,T
)执行相同的操作,然后使用内置的append/3
进行连接。请注意,新的头元素NewH
是单数,因此需要根据[NewH]
的定义将append/3
添加到单个列表结构中。{{1}}对列表进行操作。
最后一个子句传递所有其他东西(即原子,数字等 - 任何不是列表或变量的东西)。
答案 1 :(得分:2)
revall(L, Y) :-
revall(L, [], Y).
revall([], Y, Y).
revall([H|T], T2, Y) :-
is_list(H),!,
revall(H, Hr),
revall(T, [Hr|T2], Y).
revall([H|T], T2, Y) :-
revall(T, [H|T2], Y).
此处不附加