我想要的输出是:
?- mirror ([1,2], [] , X ).
X= [1,2,2,1]
到目前为止我所拥有的:
mirror(L,R,X):- L is R , [R| revertList(L,X)] .
我无法想到这是如何运作的,请帮帮我
答案 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.
有关详细信息,请参阅dcg。
请注意,根据上面的定义,我们有:
?- phrase(mirror(Ls), [a,b,a]). false.
我将这个定义(如有必要)概括为一个简单的练习。
答案 2 :(得分:0)
这样可以获得所需的“输出”:
mirror(_,_,[1,2,2,1]).
这可能不适用于大多数输入,但由于你没有解释输入和输出之间的关系,除了这一个案例,这是我能做的好事。