在prolog中递归地旋转列表

在prolog中递归地旋转列表,prolog,Prolog,我试图在prolog中递归地旋转一个列表,但它并没有像预期的那样工作 代码: 输出: ?- rot([1,2,3], V). V = [[[[]|3]|2]|1] 预期产出: ?- rot([1,2,3], V). V = [3,2,1] 有人能解释一下为什么我的代码不起作用吗?您的代码不起作用,因为在像[H | t]这样的表达式中,H是列表的一个元素,t是列表的尾部,也是一个列表。例如: ?- [H|T] = [1,2,3]. H = 1, T = [2, 3]. 那么,当你换个方向时会

我试图在prolog中递归地旋转一个列表,但它并没有像预期的那样工作

代码:

输出:

?- rot([1,2,3], V).
V = [[[[]|3]|2]|1]
预期产出:

?- rot([1,2,3], V).
V = [3,2,1]

有人能解释一下为什么我的代码不起作用吗?

您的代码不起作用,因为在像
[H | t]
这样的表达式中,
H
是列表的一个元素,
t
是列表的尾部,也是一个列表。例如:

?- [H|T] = [1,2,3].
H = 1,
T = [2, 3].
那么,当你换个方向时会发生什么呢

?- [H|T] = [1,2,3], X = [T|H].
H = 1,
T = [2, 3],
X = [[2, 3]|1].

看到问题了吗?

因为Prolog是非类型化的,所以您确实可以编写类似于
[List | Element]
的内容,但是如果您想让列表有意义,那么构建列表的唯一方法就是类似于
[Element | List]
。所以
[T2 | H]
毫无意义。在这种情况下,
T2
应该是一个元素,
H
应该是一个列表(或空列表
[]

您需要定义两个谓词:

  • 主谓词(
    rot/2
    ),它只是从给定列表中弹出头部并调用递归谓词;及
  • 递归谓词(此处为
    rot/3
    ),它只传递给定列表的所有元素,并将原始head作为tail元素发出
这两种方法的共同作用如下:

%main predicate rot/2
rot([],[]).
rot([H|T1],T2) :-
    rot(T1,H,T2).

%recursive predicate rot/3
rot([],Last,[Last]).
rot([H|T1],Last,[H|T2]) :-
    rot(T1,Last,T2).

问题在于第二条。我要做的是旋转L1中第一个列表的尾部,然后使用L1和第一个元素调用
append
,并将结果分配给L(第二个参数)


您正在定义格式为
-(my,append([],L,L))
的子句。
%main predicate rot/2
rot([],[]).
rot([H|T1],T2) :-
    rot(T1,H,T2).

%recursive predicate rot/3
rot([],Last,[Last]).
rot([H|T1],Last,[H|T2]) :-
    rot(T1,Last,T2).
my-append([], L, L).
my-append([H|T], L, [H|R]) :- my-append(T, L, R).

rot([], []).
rot([H|T], L) :- rot(T, L1), my-append(L1, H, L).