我正在努力学习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])
答案 0 :(得分:1)
如果last(L, X)
是X
的最后一个元素,则SWI Prolog有L
成功。
使用该谓词,您可以轻松地将所需的谓词last_as_first(L, [X|L])
定义为 [X|L]
是从列表L
的最后一个元素组成的列表,也用作头部如果 X
是L
的最后一个元素。用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];