我想编写一个Prolog程序,以将中间元素从奇数列表中删除到另一个列表中。
例如,如果我们给出:delete_mid([1,2,3,4,5],L),它将产生:L = [1,2,4,5]作为答案。

最佳答案

令我感到惊讶和悲伤的是,到目前为止,没有一个答案采用最明显的方法。当然,您在学校听说过它(我怀疑这可能是OP所期望的)。
但是,这很难解释或立即执行,因此,首先,这是找到中间元素的条件:

list_mid([H|T], Mid) :-
    list_mid_1(T, T, H, Mid).

list_mid_1([], _, Mid, Mid).
list_mid_1([_,_|Fast], [S|Slow], _, Mid) :-
    list_mid_1(Fast, Slow, S, Mid).
我希望名字很明显。
?- list_mid([], Mid).
false.

?- list_mid([x], Mid).
Mid = x.

?- list_mid([a,x,b], Mid).
Mid = x.

?- list_mid([a,a,x,b,b], Mid).
Mid = x.

?- list_mid([a,a,x,b], Mid).
false.
似乎可以工作。现在,我可以尝试添加该零件,以保持其当前丢掉的东西。

我很忙,所以花了一段时间。同时,the answer by Raubsauger正是我所想到的。我没有看到它,而是这样写的:
delete_mid([H|T], L) :-
    delete_mid_1(T, T, H, L).

delete_mid_1([], Rest, _, Rest).
delete_mid_1([_,_|Fast], [H|Slow], Prev, [Prev|Back]) :-
    delete_mid_1(Fast, Slow, H, Back).
它不像Raubsauger的解决方案那么整洁,但似乎在其他方面都是相同的解决方案。对于测试用例,它以@false终止。

我认为list_middle/2谓词就足够了;我再次感到惊讶,并为只有劳伯绍格(Raubsauger)看到了它(或已经知道这一点)而感到有些难过。

Und täglich grüßt das Murmeltier

关于list - 删除列表的中间元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64692632/

10-12 02:42