gpt4 book ai didi

while-loop - 如何在条件不变的情况下在Prolog中模拟while循环?

转载 作者:行者123 更新时间:2023-12-04 16:53:01 24 4
gpt4 key购买 nike

所以基本上我想在Prolog中模拟一些C代码。

在Prolog中很容易模拟while循环,情况是这样的:

C代码:

int a = 1;

while(N)
{
N--;
a++;
}

序言代码:
prolog_while(0) : !
prolog_while(N, A) :
N1 is N -1,
A1 is A + 1,
prolog_while(N1, A1).

一个问题是如何在条件不变的情况下在Prolog中模拟while循环?

就是这种情况:
int n = 1;
int a = 1;

while(1)
{
if (N==0)
goto while_end;
else
{
N--; A++;
}
}

或者
while(1)
{
if (N==0)
break;
else
{
N--; A++;
}
}

我知道这有点奇怪,但基本上这类C代码是由源代码分析工具自动生成的,因此我必须处理它。

那么,基本上我该如何在Prolog中进行仿真?可以吗?

谁能给我些帮助吗?

==================更新============

我试图以这种方式编写一些Prolog代码,但是基本上我仍然不知道如何处理测试子句。
main :- loop_entry(2, 1), write(N), nl, write(A), nl.

do(A, N, A1, N1) :- A1 is (A + 1), N1 is (N - 1).
test(N) :- ... <----- # How to write this part?
loop_entry(N, A) :-
test(N),
do(A, N, A1, N1),
loop_entry(N1,A1).

最佳答案

在Prolog中执行无限循环的最明显方法是使用repeat/0,它看起来像这样:

while(1)
do_something();

变成
repeat,
do_something.

真正的问题是,Prolog中没有明显的 gotobreak类似物。因此,我倾向于寻找这样的模式:
while(1) {
if (test)
break;
do_something();
}

并将其转换为Prolog,如下所示:
loop_entry :-
test,
do_something,
loop_entry.

当然,您将需要将局部变量作为参数添加到 loop_entry/0并实现 test,但是这样,当 test失败时,循环自然会结束。

按照N和A的示例进行操作会导致这种情况:
loop_entry(N, A) :-
N > 0,
succ(N0, N),
succ(A, A1),
loop_entry(N0, A1).

在这种情况下,“测试”就是 N > 0。如果不正确,则谓词只会失败,您可以继续Prolog方式。

编辑#2。如果要得到结果(N和A),则为要返回的值添加其他参数,并添加另一个子句:
loop_entry(N, A, ResultN, ResultA) :-
N > 0, !,
succ(N0, N),
succ(A, A1),
loop_entry(N0, A1, ResultN, ResultA).
loop_entry(N, A, N, A).

您可以在条件之后添加割线,也可以在新子句中添加逆条件。

关于while-loop - 如何在条件不变的情况下在Prolog中模拟while循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22885622/

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