【发布时间】:2018-05-08 01:26:23
【问题描述】:
我正在尝试实现一个递归 Prolog 谓词,当给定一个全 0 列表 ResultList 和 Dim 元素和另一个值高达 Dim 的列表时,它会在第二个列表中运行并增加 +1 到ResultList 的第 n 个元素并返回 ResultList,到目前为止我有:
increment_list([],_).
increment_list([Element|Tail],ResultList):-
nth1(Element,ResultList,_ is _+1),
increment_list(Tail,ResultList).
例如
?-increment_list([1,2,4,3,4],[0,0,0,0]).
会返回:
[1,1,1,2]
我显然遇到的困难和困惑是如何增加值,是否可以在不定义额外谓词或使用单例变量的情况下做到这一点?
【问题讨论】:
-
不,如果不定义额外的谓词就不可能做到这一点,尽管lambda 库可能会使它更容易。在对
nth1/3的调用中坚持_ is _+1的想法绝对行不通。请记住,Prolog 将统一这些值,而不是计算它们;is/2将执行算术运算,但这个表达式在任何地方都没有多大意义,因为您正在丢弃加法的结果。另请记住,Prolog 不会就地评估表达式。这是 Prolog 的核心区别。