首页 > 解决方案 > 如何反转列表并将所有指定值替换为其他值?

问题描述

假设我们有一个列表:[1,2,2,3,4]. 问题可以分为两部分:

反转列表很容易,这是一个工作代码:

simple_reverse(List, Rev) :-
        simple_reverse(List, Rev, []).

simple_reverse([], L, L).
simple_reverse([H|T], L, SoFar) :-
        simple_reverse(T, L, [H|SoFar]).

但是我在更换元素时遇到了一些麻烦。我尝试了以下方法:

reverse(a, b, List, Rev) :-
        reverse(a, b, List, Rev, []).

reverse(a, b, [], L, L).

reverse(a, b, [H|T], L, SoFar) :-
        reverse(a, b, T, L, [H|SoFar]).

reverse(a, b, [a|T], L, SoFar) :-
        reverse(a, b, T, L, [b|SoFar]).

问题是什么?顺便说一句,我正在使用https://swish.swi-prolog.org/来运行代码。

标签: prolog

解决方案


您需要将变量放入和谓词中,而不仅仅是a, (它们是原子):breverse/4reverse/5

reverse(A, B, List, Rev) :-
        reverse(A, B, List, Rev, []).

reverse(_, _, [], L, L).

reverse(A, B, [H|T], L, SoFar) :-
        dif(A,H),              %case where H is not A so we skip it
        reverse(A, B, T, L, [H|SoFar]).

reverse(A, B, [A|T], L, SoFar) :-
        reverse(A, B, T, L, [B|SoFar]).

推荐阅读