在 prolog 中镜像一个列表

mirroring a list in prolog

我想要的输出是这样的:

?- mirror ([1,2], [] , X ).
X= [1,2,2,1]

我目前拥有的:

mirror(L,R,X):- L is R , [R| revertList(L,X)] .

我想不出这是怎么回事,请帮帮我

这会给你想要的 "output":

mirror(_,_,[1,2,2,1]).

这可能不适用于大多数输入,但由于您除了这个案例之外没有解释任何输入和输出之间的关系,所以我可以做到这一点。

和倒排列表没有太大区别,但是你怎么写是行不通的。我 googled "Prolog is" 大约 10 秒后,我看到 is/2 用于算术表达式。我也不知道你怎么认为你可以放置谓词,但也许这是不可能的?如果你只想追加那么你可以使用 append 将镜像反向列表追加到原始列表的末尾以获得最终的 "mirror" 结果:

mirror(X, Y) :- reverse(X, R), append(X, R, Y).

但这也太简单了吧?所以我想知道这个问题可能还有更多?我不知道当你只需要两个参数时你为什么有三个参数?也许你认为你可以使用累加器来反转列表,因为要反转列表你可以像这样使用累加器?

list_rev(L, R) :- list_rev(L, [], R).

list_rev([], R, R).
list_rev([X|Xs], Ys, R) :-
    list_rev(Xs, [X|Ys], R).

但这很容易 google,我只是 google 找到它,所以也许你也 google 不喜欢它?要获得 "mirrored" 你只需要保留原始列表,如下所示:

list_mirrored(L, M) :- list_mirrored(L, [], M).

list_mirrored([], M, M).
list_mirrored([X|Xs], Ys, [X|Zs]) :-
    list_mirrored(Xs, [X|Ys], Zs).

我不确定这是否正确,我 googled "Prolog append" 就是这样做的。

要在 Prolog 中描述 列表 ,请始终考虑 DCG 表示法

例如,在这个具体案例中:

mirror([])     --> [].
mirror([M|Ms]) --> [M], mirror(Ms), [M].

您的测试用例:

?- phrase(mirror([1,2]), Ls).
Ls = [1, 2, 2, 1].

其他方向也有效。例如:

?- phrase(mirror(Ls), [a,b,c,c,b,a]).
Ls = [a, b, c] ;
false.

最一般的查询产生:

?- phrase(mirror(Ls), Ms).
Ls = Ms, Ms = [] ;
Ls = [_5988],
Ms = [_5988, _5988] ;
Ls = [_5988, _6000],
Ms = [_5988, _6000, _6000, _5988] ;
Ls = [_5988, _6000, _6012],
Ms = [_5988, _6000, _6012, _6012, _6000, _5988] ;
etc.

有关详细信息,请参阅

请注意,根据上面的定义,我们有:

?- phrase(mirror(Ls), [a,b,a]).
false.

我将概括此定义(如有必要)作为一项简单的练习。