传递Prolog谓词的结果

Dan*_*pel 3 prolog

如何评估prolog谓词作为参数传递的结果?我正在尝试编写代码来反转列表中的元素对:

swap([A,B,C,D,E,F],R).
Run Code Online (Sandbox Code Playgroud)

我想要结果:

[B,A,D,C,F,E]
Run Code Online (Sandbox Code Playgroud)

但我得到了这个结果:

append(append(append([],[B,A],[D,C],[F,E])))
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

swap(L,R) :- swapA(L,[],R).
swapA([],A,A).
swapA([H,H2|T],A,R) :-  swapA(T, append(A,[H2,H]), R).
Run Code Online (Sandbox Code Playgroud)

谢谢.

m09*_*m09 8

几件事:

  • 变量以大写字母开头,如果要将原子与变量区分开来,请将其包装在':['A','B','C','D','E','F']
  • 您不需要追加成功实现此谓词.使用append时复杂性更差.
  • 因为你不需要追加,你也不需要3个参数,2就足够了

这是一个建议:

swapA([], []).
swapA([X, Y|T], [Y, X|R]) :- swapA(T, R).
Run Code Online (Sandbox Code Playgroud)

如果您希望在列表中包含奇数个元素时保留谓词,请考虑添加另一个基本案例:

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

  • @false:我坚持OP的语义:在奇数个元素上失败.但是,好的,一个很好的小`swapA([X],[X]).`如果需要可以添加.实际上,我的第一个版本包括它,但我编辑坚持OP的版本:p (4认同)