所以基本上我试图在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)
在Prolog中进行无限循环的最明显方法是使用repeat/0
,它看起来像这样:
while(1)
do_something();
Run Code Online (Sandbox Code Playgroud)
变
repeat,
do_something.
Run Code Online (Sandbox Code Playgroud)
那么真正的问题就变成,有没有明显的模拟是对goto
或break
在序言.所以我倾向于寻找这样的模式:
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)
您可以在条件之后添加剪切,也可以在此新子句中添加反向条件.