Prolog:交换列表中的第一个和最后一个元素

Geo*_*nza 1 prolog dcg

我正在尝试编写一个交换第一个和最后一个元素的程序.

该函数有2个参数.列表和变量,显示为新交换的列表.

我以为我是以懒惰的方式做这件事,但事实证明这对我来说同样艰难.

我要抓住头部,把它放在一边 - 抓住尾巴的最后一个元素,把它放在一边 - 取尾巴,取出最后一个元素,也把它放在一边,然后将所有3个附加在一起制作一个清单

我在删除尾巴的最后一个元素时遇到了麻烦.

我有这样的事情:

swap( [H|T],  Y ) :-

  % GET HEAD, LAST OF TAIL, AND TAIL WITH LAST ELEM REMOVED

  % GET HEAD (NEW LAST ELEMENT)

   H = NEW_LASTELEMENT,

  % GET LAST ELEMENT (LAST OF TAIL, WILL BE NEW HEAD)

   last(T,X), X = NEWHEAD, 

  % CUT END OF TAIL OFF

   cutlast(T, Z), REST OF CODE . . .

  .



% CUT LAST
cutlast([H | T], [H | T2]) :- T = [_|_], cutlast(T, T2).
Run Code Online (Sandbox Code Playgroud)

我从网上借用了cutlast谓词,但我不确定它是如何工作的.我已经测试了将参数传递给它一小时了,它们都会继续返回false.任何帮助表示赞赏.

Ser*_*nko 5

可能只是:

swap(A, B) :-
    append([First | Mid], [Last], A),
    append([Last | Mid], [First], B).
Run Code Online (Sandbox Code Playgroud)

如果需要,可以使用一个元素和空列表成功的其他事实:

swap([X], [X]).
swap([], []).
Run Code Online (Sandbox Code Playgroud)

  • @GeorgeCostanza,你的代码中的注释表明你在程序上思考,就好像你是用C/C++编程一样.在Prolog中,它是关系和模式匹配.在Sergey的解决方案中,他知道一个名为`append/3`的内置函数,它定义了3个列表之间的关系,其中第3个是粘贴在一起的第3个.`swap`使用这种关系并简单地定义`B`是什么`append`知道什么'A`看起来像`append`.如果`A`是第一个元素,中间列表和最后一个元素,那么`B`是最后一个元素,相同的中间列表和第一个元素. (4认同)