gpt4 book ai didi

prolog - B-Prolog 中带累加器的嵌套循环

转载 作者:行者123 更新时间:2023-12-01 11:40:34 26 4
gpt4 key购买 nike

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。

最佳答案

您的程序在编译时可以正确运行。

| ?- cl(谢尔盖)

Compiling::sergey.pl
** Warning: Variable 'Sb' is treated as global in foreach (17-25).
** Warning: Variable 'Sb' is treated as global in list_comprehension (36-38).
compiled in 0 milliseconds
loading...

yes
| ?- test1
sa(6)

yes
| ?- test2
sb(6)
sb(6)
sb(6)
sa(18)

yes
| ?- test3
sb(6)
sb(6)
sb(6)
sa(18)

解释器一定有问题。这个蓄电池的东西非常丑陋,我从来没有用过它。在 B-Prolog 的后继者 Picat 中,您可以使用 := 来“更新”变量。

    test1 =>
Sa = 0,
foreach(A in 1..3)
Sa := Sa+A
end,
writeln($sa(Sa)).

test2 =>
Sa = 0,
foreach(_A in 1..3)
Sb := 0,
foreach(B in 1..3)
Sb := Sb+B
end,
writeln($sb(Sb)),
Sa := Sa+Sb
end,
writeln($sa(Sa)).

更好的方法是使用列表理解。

    test1 =>
Sa = sum([A : A in 1..3]),
writeln($sa(Sa)).

test2 =>
Sa = sum([Sb : _A in 1..3, Sb=sum([B : B in 1..3])]),
writeln($sa(Sa)).

编译器将求和编译成使用“:=”的程序。由于实际上并未构造列表,因此没有开销。

关于prolog - B-Prolog 中带累加器的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21249849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com