list - Prolog 添加 N 到 0 到列表

标签 list prolog add

我想添加到结果列表 N 到 0 位。

示例查询

?- add(5,R).

应该返回答案:

R = [5,4,3,2,1,0].

我已经尝试了以下代码,但它没有用。

add(0, 0).
add(N, [R]) :-
   N1 is N-1,
   add(N1, [R|N]).

最佳答案

你太接近了!

add(0, [0]).
add(N, [N|R]) :- 
  N > 0, 
  N1 is N-1, 
  add(N1, R).

那么,这里有什么不同?

  1. add(0, [0])[0] 而不是 0 因为你正在构建一个列表,不是整数;否则你会得到相当尴尬的 [5,4,3,2,1|0] 结果。

  2. N > 0 作为守卫,以确保一旦达到基本情况,我们就不会永远循环遍历负数。

  3. 这项工作是在 add/2 的第二个子句的头部而不是它的主体中完成的。也就是说,我们的模式是 add(N, [N|R]) 而不是 add(N, [R])。这是因为该术语将 N 添加到列表的头部,而不是在重复出现之前添加它。

  4. 同样,您在[R|N] 中有一个简单的反转;这会以倒退的方式构建列表。

总而言之,我认为你们非常亲密。在提示符下多做一些试验可能就足以修复它。你试过使用 trace/0 了吗?

关于list - Prolog 添加 N 到 0 到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33925916/

相关文章:

python - 从 python 列表中获取元素的唯一组合

flutter - 如何使用 getx 包在 Flutter 中使列表可观察?

Python;使用字典查找数字代码的因子。为什么这不起作用?

PHP - 使用 foreach 循环自动在关联数组中添加记录

git - 无法跟踪 Git 子模块中的文件

python - 对列表的重复元素进行分组

prolog - 剪切子句的开头以及 "cut"、 `!` 和 `fail` 之间的关系

prolog - 找出 Prolog 中无法证明的内容

database - 如何在Prolog中进行参数搜索?

ios - 如何在 XCode 4.2.1 (SDK5.0) 中安装旧版 iOS 模拟器