【发布时间】:2014-01-22 17:57:02
【问题描述】:
B-Prolog 有逻辑循环。例如,我们可以这样计算 [1,2,3] 的总和:
test1 :-
foreach(A in 1..3, [], ac(Sa, 0), (
Sa^1 is Sa^0 + A
)),
writeln(sa(Sa)).
?- test1.
test1.
sa(6)
yes
但是当我尝试两个带有累加器的嵌套循环时,我得到了错误:
test2 :-
foreach(_A in 1..3, [Sb], ac(Sa, 0), (
foreach(B in 1..3, [], ac(Sb, 0), (
Sb^1 is Sb^0 + B
)),
writeln(sb(Sb)),
Sa^1 is Sa^0 + Sb
)),
writeln(sa(Sa)).
?- test2.
test2.
*** error(invalid_argument,(+)/2)
另一种变体,外循环的局部变量列表中不包括Sb:
test3 :-
foreach(_A in 1..3, [], ac(Sa, 0), (
foreach(B in 1..3, [], ac(Sb, 0), (
Sb^1 is Sb^0 + B
)),
writeln(sb(Sb)),
Sa^1 is Sa^0 + Sb
)),
writeln(sa(Sa)).
?- test3.
test3.
sb(6)
*** error(invalid_argument,(+)/2)
在 B-Prolog 中甚至可以使用累加器嵌套循环吗?
我的 B-Prolog 版本是 8.0#1。
【问题讨论】:
-
在你的真实代码中,内循环的目标是依赖外循环的变量还是累加器?在此处显示的代码中,
Sb是常量,可以预先计算。我猜你的真实代码中不是这种情况? -
是的,我只是提供了非常简单的废话代码来显示带有累加器的嵌套循环的问题。
-
是的,我也很怀疑。 :)
-
请注意
(^)/2在Sb^1 is Sb^0 + B中的使用与ISO 可评估函子(^)/2发生冲突。见complang.tuwien.ac.at/ulrich/iso-prolog/dtc2#pow