prolog - 如何反转列表并将所有指定值替换为其他值?
问题描述
假设我们有一个列表:[1,2,2,3,4]
. 问题可以分为两部分:
- 反转列表(我们应该收到
[4,3,2,2,1]
) - 替换,例如全部
2
用100
,所以我们应该收到[4,3,100,100,1]
反转列表很容易,这是一个工作代码:
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/来运行代码。
解决方案
您需要将变量放入和谓词中,而不仅仅是a
, (它们是原子):b
reverse/4
reverse/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]).
推荐阅读
- javascript - 将类函数公开给使用 JavaScript 中的字符串创建的函数?
- pine-script - 重复的数字和字母集代替枢轴 HL 值
- java - 使用并发时超出时间限制
- python - 如何使用星体包将日落和日出数据的结果转换为数据框?
- python - 在训练测试拆分后使用 LabelEncoder 在分类变量中编码看不见/新的标签?
- python - 数据框不按日期排序
- c# - Autofac 在 MediatR 处理程序完成工作之前处理我的 DbContext
- django - Django 3.2 `get_asgi_application` 不能替代通道 AsgiHandler
- c++ - 使用 AVX-512 的两组 SIMD 矢量交集:需要加速
- laravel - 在 Laravel 8 中持久化数组数据