在 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.
有关详细信息,请参阅 dcg。
请注意,根据上面的定义,我们有:
?- phrase(mirror(Ls), [a,b,a]).
false.
我将概括此定义(如有必要)作为一项简单的练习。
我想要的输出是这样的:
?- 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.
有关详细信息,请参阅 dcg。
请注意,根据上面的定义,我们有:
?- phrase(mirror(Ls), [a,b,a]). false.
我将概括此定义(如有必要)作为一项简单的练习。