gpt4 book ai didi

prolog - Prolog中如何处理这个 "multiple loop"?

转载 作者:行者123 更新时间:2023-12-02 02:40:42 25 4
gpt4 key购买 nike

所以基本上我正在尝试编写一个 Prolog 代码,模拟这个多个循环:

int foo()
{
int i, j, m;
m = 1;
i = 0;
for (; i < 5; i++)
{
j = 0;
for (; j < 5; j++)
m = i + j + m;
}

return m;
}

我的 Prolog 代码是这样的:

foo(M02) :-
M01 is 1,
I01 is 0,
loop_entry_1(M01, J01, I01, M02, J02, I02).

loop_entry_1(M01, J01, I01, FinalM, FinalJ, FinalI) :-
I01 < 5, !,
J01 is 0, %% I failed here!!
loop_entry_0(M01, J01, I01, M02, J02, I01),
I02 is I01 + 1,
loop_entry_1( M02, J02, I02 , FinalM, FinalJ, FinalI).
loop_entry_1( M01, J01, I01, M01, J01, I01).

loop_entry_0(M01, J01, I01, FinalM, FinalJ, FinalI) :-
J01 < 5, !,
M02 is (I01 + J01) + M01,
J02 is J01 + 1,
loop_entry_0(M02, J02, I01 , FinalM, FinalJ, FinalI).
loop_entry_0(M01, J01, I01, M01, J01, I01).

所以问题是,每次执行退出loop_entry_0时,J01已经被赋值给5,并且会在J01为0

但我就是想不出解决这个问题的方法......

有人可以帮我吗?

最佳答案

您正在尝试在 Prolog 中模拟状态。您已经弄清楚了如何做到这一点:本质上,通过一系列逻辑变量,您可以模拟单个(非逻辑)变量。这种模拟通常被称为“差异”。常见的约定是这样命名此类变量:S0, S1, S2, ... S。所以“最终”状态没有任何数字。通过这种方式,您可以在不知道需要多少个中间状态的情况下启动规则,例如:

p(S0, S) :-
...

因此,每次为变量分配新值时,您也需要一个新的逻辑变量。但是,你说J01是0!等等,我们说过:新状态意味着新变量!因此,您必须在这里引入一个新的中间变量,或者只需将下一个目标中的 J01 替换为 0

与差异相关的另一个常见约定是将相关参数紧随其后。

然后,尽管这种做法并不常见,但您可以省略这些参数之间的空格,以便更好地看出它们是彼此所属的。

哦,我忘记了:在循环内恰好恒定的变量不需要复制。

因此,根据所有这些约定,将编写 foo/1 (注意不同的参数顺序!):

foo(M) :-
loop_entry_1(1,M, 0,_).

loop_entry_1(M0,M, I0,I) :-
I0 < 5, !,
loop_entry_0(M0,M1, 0,_, I0),
I1 is I0+1,
loop_entry_1(M1,M, I1,I).
loop_entry_1(M,M, I,I).

loop_entry_0(M0,M, J0,J, I) :-
J0 < 5, !,
M1 is I + J0 + M0,
J1 is J0 + 1,
loop_entry_0(M1,M, J1,J, I).
loop_entry_0(M,M, J,J, _).

B-但是:我意识到,我们可以完全删除一些状态变量。事实上:

foo(M) :-
loop_entry_1(1,M, 0).

loop_entry_1(M0,M, I0) :-
I0 < 5, !,
loop_entry_0(M0,M1, 0, I0),
I1 is I0+1,
loop_entry_1(M1,M, I1).
loop_entry_1(M,M, _).

loop_entry_0(M0,M, J0, I) :-
J0 < 5, !,
M1 is I + J0 + M0,
J1 is J0 + 1,
loop_entry_0(M1,M, J1, I).
loop_entry_0(M,M, _, _).

所以这是另一个技巧:如果您只需要简单的仅尾递归函数中的状态,那么您可以忽略第二个参数!参数之间的空格对于区分复杂状态 (M) 和简单状态有多重要!

<小时/>

我真的应该补充一点:这种一对一的翻译可能很有趣,但并不能为特定问题提供很多见解。

关于prolog - Prolog中如何处理这个 "multiple loop"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23981329/

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