反向列表清单

时间:2012-04-10 01:43:34

标签: list prolog reverse

我的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函数和递归调用列表,如果它不是原子的...但我被卡住了......你们知道怎么写吗?

2 个答案:

答案 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).

此处不附加