如何在不可更改的条件下模拟Prolog中的while循环?

lll*_*lll 5 prolog while-loop

所以基本上我试图在Prolog中模拟一些C代码.

在Prolog中很容易模拟while循环以下是这种情况:

C代码:

int a = 1;

while(N)
{
  N--;
  a++; 
}
Run Code Online (Sandbox Code Playgroud)

Prolog代码:

prolog_while(0) : !
prolog_while(N, A) :
   N1 is N -1,
   A1 is A + 1,
prolog_while(N1, A1).
Run Code Online (Sandbox Code Playgroud)

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

情况如下:

int n = 1;
int a = 1;

while(1)
{
   if (N==0)
     goto while_end;
   else
    {
        N--; A++;
    }       
}
Run Code Online (Sandbox Code Playgroud)

要么

while(1)
{
   if (N==0)
     break;
   else
    {
        N--; A++;
    }       
}
Run Code Online (Sandbox Code Playgroud)

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

那基本上我怎样才能在Prolog中模拟?它可行吗?

谁能给我一些帮助?

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

我试着用这种方式编写一些Prolog代码,但基本上我还是不知道如何处理test子句.

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).
Run Code Online (Sandbox Code Playgroud)

Dan*_*ons 8

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

while(1)
    do_something();
Run Code Online (Sandbox Code Playgroud)

repeat,
do_something.
Run Code Online (Sandbox Code Playgroud)

那么真正的问题就变成,有没有明显的模拟是对gotobreak在序言.所以我倾向于寻找这样的模式:

while(1) {
  if (test)
    break;
  do_something();
}
Run Code Online (Sandbox Code Playgroud)

并将其转换为Prolog,如下所示:

loop_entry :-
  test,
  do_something,
  loop_entry.
Run Code Online (Sandbox Code Playgroud)

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

按照N和A的例子导致这种事情:

loop_entry(N, A) :-
  N > 0,
  succ(N0, N),
  succ(A, A1),
  loop_entry(N0, A1).
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"测试"很简单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).
Run Code Online (Sandbox Code Playgroud)

您可以在条件之后添加剪切,也可以在此新子句中添加反向条件.