我是prolog的新手,所以这对我来说是一个很大的挑战.我应该在Prolog中实现一个简单的C语言.
the ultimate goal is to be able to execute something like this:
?- run([begin,a,:=,10,while,a,>,5,begin,write,a,a,:=,a,-,1,end,end]).
and get:
10
9
8
7
6
yes
Run Code Online (Sandbox Code Playgroud)
但是,我陷入了第一步.这是我迄今取得的成就.超出本地堆栈!
statement(Vars,_Vars) --> assign(Vars,_Vars).
statement(Vars,Vars2) --> statement(Vars,Vars1), statement(Vars1,Vars2).
assign(Vars,_Vars) --> default_assign(Vars,_Vars).
assign(Vars,_Vars) --> simple_assign(Vars,_Vars).
% a //default value 0
default_assign(Vars,_Vars) -->
var_name(Var_Name),
{update_vars([Var_Name,0],Vars,_Vars)}.
% a = 0
simple_assign(Vars,_Vars) -->
var_name(Var_Name),[=],var_value(Var_Value),
{update_vars([Var_Name,Var_Value],Vars,_Vars)}.
% a = b
simple_assign(Vars,_Vars) -->
var_name(Var_Name1),[=],var_name(Var_Name2),
{
update_vars([Var_Name1,Var_Value],Vars,_Vars)
}.
var_name(Var_Name) --> [Var_Name],{\+number(Var_Name2)}.
var_value(Var_Value) -->[Var_Value],{number(Var_Value)}.
% found match, update
update_vars(Var,Vars,_Vars):-
member(Var,Vars),
update(Var,Vars,_Vars),
_Vars\==[].
% no match, …
Run Code Online (Sandbox Code Playgroud)