gpt4 book ai didi

prolog - 在 Prolog 中实现一个简单的 C 语言?

转载 作者:行者123 更新时间:2023-12-04 15:22:59 30 4
gpt4 key购买 nike

我是 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

但是,我被困在了第一步。
这是我迄今为止所取得的成就。超出本地堆栈!
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, append
update_vars(Var,Vars,_Vars):-
\+member(Var,Vars),
append(Var,Vars,_Vars).

update([Name,Value],[],[]).
update([Name,Value],[[Name,Old_Value]|T1],[[Name,Value]|T2]):-
update([Name,Value],T1,T2).
update([Name,Value],[[Name1,Value1]|T1],[[Name1,Value1]|T2]):-
[Name,Value]\=[Name1,Value1],
update([Name,Value],T1,T2).

append([Name,Value],[],[[Name,Value]]).
append([Name,Value],[H|T1],[H|T2]):-
append([Name,Value],T1,T2).

这是我的逻辑。首先,我希望能够使用列表(这就是我解释它的方式 - -!),因此语法结构非常重要。
而且我还在考虑使用 [[Name,Value],[a,1],[b,2]...] 形式的变量列表“Vars”,以及更新版本 - '_Vars'。所以我可以将它传递给其他语句,例如 while 循环和 write。
statement(Vars,Vars2) --> statement(Vars,Vars1), statement(Vars1,Vars2).
% this seems wrong...

但是……一开始的逻辑好像不对。 :\下面是简化版。
如果您能在这里帮助我,我将不胜感激。我真的希望我不会在圣诞节带着这个。 TT
statement --> assign.
statement --> statement, statement.

assign --> simple_assign.
assign --> default_assign.

default_assign -->
var_name(Var_Name).
simple_assign -->
var_name,[=],var_value.

var_name -->
[Var_Name],{\+number(Var_Name)}.
var_value -->
[Var_Value],{number(Var_Value)}.

最佳答案

这就是我将如何去做:

  • 将源代码转换为抽象语法树
    begin 
    a := 1
    while a < 5
    begin
    a := a + 1;
    end
    end

    变成
    statements([
    assign(a, number(1)),
    while(greater(variable(a), number(5))),
    statements([
    assign(a, plus(variable(a), number(1)))
    ])
    )
    ])
  • 为它构建一个解释器。

    有各种解释器。最简单的是 Vanilla 解释器。
    这是我要开始的一个:
    interpret(number(N), State, N, State).
    interpret(assign(Variable, Statement), State, Value, NewState) :-
    interpret(Statement, State, Value, NewState1),
    assignVariable(Variable, Value, NewState1, NewState).
  • 关于prolog - 在 Prolog 中实现一个简单的 C 语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20631661/

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