我是新來的prolog,所以這對我來說是一個很大的挑戰。 我應該在Prolog中實現一個簡單的C語言。在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循環和寫入等其他語句。
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)}.
C-like,你確定嗎?這看起來非常像帕斯卡:) – 2013-12-17 11:09:44
這是一個有趣的練習,不像我見過的任何東西。 – hardmath
哈哈。我會保持這篇文章更新。 – Hashbug