镜像prolog中的列表

时间:2017-03-28 11:43:42

标签: list recursion prolog mirror

我想要的输出是:

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

到目前为止我所拥有的:

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

我无法想到这是如何运作的,请帮帮我

3 个答案:

答案 0 :(得分:3)

与撤消列表并没有什么不同,但是如何编写它并不会起作用。我用谷歌搜索“Prolog is”,大概10秒后我看到is/2用于算术表达式。我也不知道你怎么认为你可以把谓词但也许不可能?如果您只想追加,那么您可以使用append将镜像反转列表附加到原始列表的末尾以获得最终的“镜像”结果:

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).

但这很容易谷歌,我只是谷歌搜索并找到它,所以也许你用谷歌搜索它,你不喜欢它?要获得“镜像”,您只需要保留原始列表,如下所示:

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).

我不确定这是否正确,我用谷歌搜索“Prolog追加”,这就是它的完成方式。

答案 1 :(得分:2)

要在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.

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

答案 2 :(得分:0)

这样可以获得所需的“输出”:

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

这可能不适用于大多数输入,但由于你没有解释输入和输出之间的关系,除了这一个案例,这是我能做的好事。