添加到列表的前面,在列表末尾找到相同的元素

时间:2018-05-24 18:20:15

标签: prolog

我正在努力学习Prolog,但发现它非常困难。我无法将列表末尾的元素添加到列表的前面。到目前为止,我所能做的就是删除元素并将其放在前面,但是,我不想删除它,我希望它留在后面并在前面添加一个实例。

我已经尝试过审核类似的问题,但我仍然陷入困境。

我知道我会以错误的方式解决这个问题,但到目前为止,这就是我所拥有的:

addLastToFront([], []).
addLastToFront(L, [H|T]) :- append(T, [H], L).

产生:

 ?- addLastToFront([a,b,c,d], X) --> ([d,a,b,c])

我想做什么:

?- addLastToFront([a,b,c,d], X) --> ([d,a,b,c,d])

2 个答案:

答案 0 :(得分:1)

如果last(L, X)X的最后一个元素,则SWI Prolog有L成功。

使用该谓词,您可以轻松地将所需的谓词last_as_first(L, [X|L])定义为 [X|L]是从列表L的最后一个元素组成的列表,也用作头部如果 XL 的最后一个元素。用Prolog编写的是:

last_as_first(L, [X|L]) :- last(L, X).

如果您想使用append/3,可以将last(L, X)定义为append(_, [X], L)

last_as_first(L, [X|L]) :- append(_, [X], L).

答案 1 :(得分:0)

list([])     --> [].
list([L|Ls]) --> [L], list(Ls).

concatenation([]) --> [].
concatenation([List|Lists]) -->
        list(List),
        concatenation(Lists).

您可以使用https://www.metalevel.at/prolog/dcg中的此DCG,然后查询:

?-List1 =[a,b,c],phrase(concatenation([Front,[Last]]),List1),List2 = [Last|List1].
Front = [a, b],
Last = c,
List1 = [a, b, c],
List2 = [c, a, b, c];
相关问题