listprologinterpreter1listrecursion4.pl
- - include('listprologinterpreter3preds5.pl').
:- include('lpiverify4.pl').
%%:- include('caw.pl').
%%:- include('breasoningwriter2.pl').
%%:- include('caw4.pl').
- - dynamic debug/1.
/** List Prolog Interpreter **/
interpret(Debug,Query,Functions,Result) :-
%%writeln([i1]),
interpret1(Debug,Query,Functions,Functions,Result),
!.
interpret1(Debug,Query,Functions1,Functions2,Result) :-
%%writeln([i11]),
retractall(debug(_)),
assertz(debug(Debug)),
retractall(cut(_)),
assertz(cut(off)),
member1(Query,Functions1,Functions2,Result).
%%member1([_,R],_,[],R).
%%member1(_,_,[],[]).
member1(_,_,[],_) :- fail.
member1(Query,Functions,Functions2,Vars8) :-
%%writeln([m1]),
cut(off)->(
(Query=[Function,Arguments1],
(Functions2=[[Function,Arguments2,(:-),Body]|_Functions3]),
length(Arguments1,Length),
length(Arguments2,Length),
checkarguments(Arguments1,Arguments2,[],Vars1,[],FirstArgs),!, %%->ca2
%%writeln([checkarguments,"Arguments1",Arguments1,"Arguments2",Arguments2,"Vars1",Vars1,"FirstArgs",FirstArgs]),
(debug(on)->(writeln([call,[Function,Arguments1],"Press c."]),(not(get_single_char(97))->true;abort));true),
interpretbody(Functions,Functions2,Vars1,Vars2,Body,true),
updatevars(FirstArgs,Vars2,[],Result),
%%reverse(Result,[],Vars7),
((not(Result=[])->
%%Result=[Var71|Vars72],
unique1(Result,[],Vars8),
%%writeln(["FirstArgs",FirstArgs,"Vars",Vars2,"Result",Result,"Vars7",Vars7,"Vars72",Vars72,"Var71",Var71,"Vars8",Vars8]),
%%writeln(["Vars8",Vars8]),
findresult3(Arguments1,Vars8,[],Result2)
%%writeln([findresult3,"Arguments1",Arguments1,"Vars8",Vars8,"Result2",Result2])
);(
%%writeln(here1),
Vars8=[],Result2=[])),
%%writeln(["Arguments1",Arguments1,"Vars2",Vars2,"Result",Result]),
(debug(on)->(writeln([exit,[Function,Result2],"Press c."]),(not(get_single_char(97))->true;abort));true))
->true;
(%%Query=[Function,_Arguments1],
%%Functions2=[[Function,_Arguments2,(:-),_Body]|Functions3], %% make like previous trunk?
member11(Query,Functions,Functions2,Vars8))
);(turncut(off)%%,Result=[]
).
member11(Query,Functions,Functions2,Result) :-
%%writeln([m11]),
%%writeln(["Query",Query,"Functions",Functions,"Functions2",Functions2,"Result",Result]),
cut(off)->(
(Query=[Function],
(Functions2=[[Function,(:-),Body]|_Functions3]),
(debug(on)->(writeln([call,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true),
Result=[],
interpretbody(Functions,Functions2,[],_Vars2,Body,true),!,
(debug(on)->(writeln([exit,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true)
)->true;
(%%Query=[Function],
%%Functions2=[[Function]|Functions3],
member12(Query,Functions,Functions2,Result))
);(turncut(off)).
member12(Query,Functions,Functions2,Vars8) :-
%%writeln([m12]),
cut(off)->(
(Query=[Function,Arguments1],
(Functions2=[[Function,Arguments2]|_Functions3]),
length(Arguments1,Length),
length(Arguments2,Length),
checkarguments(Arguments1,Arguments2,[],Vars1,[],FirstArgs),!, %% ->ca2
%%writeln([checkarguments,"Arguments1",Arguments1,"Arguments2",Arguments2,"Vars1",Vars1,"FirstArgs",FirstArgs]),
updatevars(FirstArgs,Vars1,[],Result),
%%reverse(Result,[],Vars7),
((not(Result=[])->
%%Result=[Var71|Vars72],
unique1(Result,[],Vars8),
findresult3(Arguments1,Vars8,[],Result2)
);(
%%writeln(here2),
Vars8=[],Result2=[])),
(debug(on)->(writeln([call,[Function,Arguments1],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[Function,Result2],"Press c."]),(not(get_single_char(97))->true;abort));true)
)->true;
(%%Query=[Function,_Arguments1],
%%Functions2=[[Function,_Arguments2]|Functions3],
member13(Query,Functions,Functions2,Vars8))
);(turncut(off)).
member13(Query,Functions,Functions2,Result) :-
%%writeln([m13]),
cut(off)->(
(Query=[Function],!,
(Functions2=[[Function]|_Functions3]),
(debug(on)->(writeln([call,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true),
Result=[],
%%interpretbody(Functions,[],_Vars2,Body,true),
(debug(on)->(writeln([exit,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true)
)->true;
(%%Query=[Function],
Functions2=[_Function|Functions3],
member1(Query,Functions,Functions3,Result))
);(turncut(off)).
interpret2(Query,Functions1,Functions2,Result) :-
%%writeln(i2),
%%writeln(["%%interpret2 Query",Query,"Functions1",Functions1,"Functions2",Functions2]),
member2(Query,Functions1,Functions2,Result).
%%member2([_,R],_,[],R).
%%member2(_,_,[],[]).
member2(_,_,[],_) :- fail.
member2(Query,Functions,Functions2,Vars8) :-
%%writeln([m2]),
cut(off)->(
(Query=[Function,Arguments1],
(Functions2=[[Function,Arguments2,(:-),Body]|_Functions3]),
length(Arguments1,Length),
length(Arguments2,Length),
checkarguments(Arguments1,Arguments2,[],Vars1,[],FirstArgs),!,
%%writeln([checkarguments,"Arguments1",Arguments1,"Arguments2",Arguments2,"Vars1",Vars1,"FirstArgs",FirstArgs]),
(debug(on)->(writeln([call,[Function,Arguments1],"Press c."]),(not(get_single_char(97))->true;abort));true),
interpretbody(Functions,Functions2,Vars1,Vars2,Body,true), %%**arg2 change
%%writeln(["Functions",Functions,"Functions2",Functions2,"Vars1",Vars1,"Vars2",Vars2,"Body",Body]),
updatevars(FirstArgs,Vars2,[],Result),
%%reverse(Result,[],Vars7),
((not(Result=[])->
%%Result=[Var71|Vars72],
unique1(Result,[],Vars8),
findresult3(Arguments1,Vars8,[],Result2)
%%writeln(["Vars2",Vars2,"Result",Result]),
);(
writeln(here3),
Vars8=[],Result2=[])),
(debug(on)->(writeln([exit,[Function,Result2],"Press c."]),(not(get_single_char(97))->true;abort));true)
)->true;
(%%Query=[Function,_Arguments1],
%%Functions2=[[Function,_Arguments2,(:-),_Body]|Functions3],
member21(Query,Functions,Functions2,Vars8))
);(turncut(off)).
member21(Query,Functions,Functions2,Result) :-
%%writeln([m21]),
cut(off)->(
(Query=[Function],
(Functions2=[[Function,(:-),Body]|_Functions3]),
Vars1=[],
(debug(on)->(writeln([call,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true),
interpretbody(Functions,Functions2,Vars1,_Vars2,Body,true),!, %%**arg2 change
(debug(on)->(writeln([exit,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true)
)->true;
(%%Query=[Function],
%%Functions2=[[Function]|Functions3],
member22(Query,Functions,Functions2,Result))
);(turncut(off)).
member22(Query,Functions,Functions2,Vars8) :-
%%writeln([m22]),
cut(off)->(
(Query=[Function,Arguments1],
(Functions2=[[Function,Arguments2]|_Functions3]),
length(Arguments1,Length),
length(Arguments2,Length),
checkarguments(Arguments1,Arguments2,[],Vars1,[],FirstArgs),!,
%%writeln([checkarguments,"Arguments1",Arguments1,"Arguments2",Arguments2,"Vars1",Vars1,"FirstArgs",FirstArgs]),
updatevars(FirstArgs,Vars1,[],Result),
%%reverse(Result,[],Vars7),
((not(Result=[])->
%%Result=[Var71|Vars72],
unique1(Result,[],Vars8),
findresult3(Arguments1,Vars8,[],Result2)
);(
%%writeln(here4),
Vars8=[],Result2=[])),
(debug(on)->(writeln([call,[Function,Arguments1],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[Function,Result2],"Press c."]),(not(get_single_char(97))->true;abort));true)
)->true;
(%%Query=[Function,_Arguments1],
%%Functions2=[[Function,_Arguments2]|Functions3],
member23(Query,Functions,Functions2,Vars8))
);(turncut(off)).
member23(Query,Functions,Functions2,Vars8) :-
%%writeln([m23]),
cut(off)->(
(Query=[Function],!,
(Functions2=[[Function]|_Functions3]),
(debug(on)->(writeln([call,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true),
Vars8=[],
(debug(on)->(writeln([exit,[Function],"Press c."]),(not(get_single_char(97))->true;abort));true)
)->true;
(%%Query=[Function],
Functions2=[_Function|Functions3],
member2(Query,Functions,Functions3,Vars8))
);(turncut(off)).
checkarguments([],[],Vars,Vars,FirstArgs,FirstArgs).
checkarguments(Arguments1,Arguments2,Vars1,Vars2,FirstArgs1,FirstArgs2) :- %%
%%writeln(1),
Arguments1=[Value|Arguments3], %% Value may be a number, string, list or tree
expressionnotatom(Value),
Arguments2=[Variable2|Arguments4],
isvar(Variable2),
putvalue(Variable2,Value,Vars1,Vars3),
checkarguments(Arguments3,Arguments4,Vars3,Vars2,FirstArgs1,FirstArgs2).
checkarguments(Arguments1,Arguments2,Vars1,Vars2,FirstArgs1,FirstArgs2) :- %%A
%%writeln(2),
Arguments1=[Variable|Arguments3], %% Value may be a number, string, list or tree
isvar(Variable),
Arguments2=[Value|Arguments4],
expressionnotatom(Value),
putvalue(Variable,Value,Vars1,Vars3),
append(FirstArgs1,Variable,_,FirstArgs3),
checkarguments(Arguments3,Arguments4,Vars3,Vars2,FirstArgs3,FirstArgs2).
checkarguments(Arguments1,Arguments2,Vars1,Vars2,FirstArgs1,FirstArgs2) :-
%%writeln(3),
Arguments1=[Variable1|Arguments3],
isvar(Variable1),
Arguments2=[Variable2|Arguments4],
isvar(Variable2),
(getvalue(Variable2,Value,Vars1)->true;Value=empty),
putvalue(Variable2,Value,Vars1,Vars3),
append(FirstArgs1,Variable1,Variable2,FirstArgs3),
checkarguments(Arguments3,Arguments4,Vars3,Vars2,FirstArgs3,FirstArgs2).
checkarguments(Arguments1,Arguments2,Vars1,Vars2,FirstArgs1,FirstArgs2) :-
%%writeln(4),
Arguments1=[Value1|Arguments3],
expressionnotatom(Value1),
Arguments2=[Value1|Arguments4],
expressionnotatom(Value1),
checkarguments(Arguments3,Arguments4,Vars1,Vars2,FirstArgs1,FirstArgs2).
interpretbody(_Functions1,_Functions2,Vars,Vars,[],true) :- !.
interpretbody(Functions0,Functions,Vars1,Vars2,Body,Result1) :-
Body=[Statements1|Statements2],
interpretbody(Functions0,Functions,Vars1,Vars3,Statements1,Result2),
interpretbody(Functions0,Functions,Vars3,Vars2,Statements2,Result3),
%%((Result3=cut)->!;true),
logicalconjunction(Result1,Result2,Result3),!.
interpretbody(Functions0,Functions,Vars1,Vars2,Body,Result1) :-
Body=[[not,[Statements]]|Statements2],
interpretbody(Functions0,Functions,Vars1,Vars3,Statements,Result2),
%%((Result2=cut)->!;true),
interpretbody(Functions0,Functions,Vars3,Vars2,Statements2,Result3),
%%((Result3=cut)->!;true),
logicalnot(Result2,Result4),
(logicalconjunction(Result1,Result4,Result3)->true;(Result1=false)),!.
interpretbody(Functions0,Functions,Vars1,Vars2,Body,Result1) :-
Body=[[Statements1],or,[Statements2]],
(interpretbody(Functions0,Functions,Vars1,Vars2,Statements1,Result1);
%%,((Value1=cut)->!;true));
interpretbody(Functions0,Functions,Vars1,Vars2,Statements2,Result1)),!.
%%,((Value=cut)->!;true)).
%%(logicaldisjunction(Result1,Value1,Value2)->true;(Result1=false)).
interpretbody(Functions0,Functions,Vars1,Vars2,Body,Result1) :-
Body=[Statement|Statements],
%%writeln(["Functions0",Functions0,"Functions",Functions,"Statement",Statement,"Vars1",Vars1,"Vars3",Vars3,"Result2",Result2,"Cut",Cut]),
interpretstatement1(Functions0,Functions,Statement,Vars1,Vars3,Result2,Cut),
%%writeln(["here1"]),
((not(Cut=cut))->(Functions2=Functions);(turncut(on))), %% cut to interpret1/2 (assertz)
%%writeln(["here3"]),
interpretbody(Functions0,Functions2,Vars3,Vars2,Statements,Result3),
%%((Result3=cut)->!;true),
%%writeln(["here4"]),
logicalconjunction(Result1,Result2,Result3),!.
%%writeln([Result1,Result2,Result3]).
turncut(State1) :-
cut(State2),
retract(cut(State2)),
assertz(cut(State1)).
logicaldisjunction(true,Result2,Result3) :-
true(Result2);true(Result3).
logicalconjunction(true,Result2,Result3) :-
true(Result2),true(Result3).
logicalnot(Result1,Result2) :-
true(Result1),false(Result2).
logicalnot(Result1,Result2) :-
false(Result1),true(Result2).
true(true).
false(false).
%%interpretstatement1(_F0,[],_,Vars,Vars,true,nocut) :- !
%%writeln("AND HERE!")
%% .
interpretstatement1(_F0,_Functions,[cut,[]],Vars,Vars,true,cut) :- !.
interpretstatement1(_F0,_Functions,[atom,[Variable]],Vars,Vars,true,nocut) :-
getvalue(Variable,Value,Vars),
(debug(on)->(writeln([call,[atom,[Value]],"Press c."]),(not(get_single_char(97))->true;abort));true),
atom(Value),
(debug(on)->(writeln([exit,[atom,[Value]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretstatement1(_F0,_Functions,[string,[Variable]],Vars,Vars,true,nocut) :-
getvalue(Variable,Value,Vars),
(debug(on)->(writeln([call,[string,[Value]],"Press c."]),(not(get_single_char(97))->true;abort));true),
string(Value),
(debug(on)->(writeln([exit,[string,[Value]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretstatement1(_F0,_Functions,[number,[Variable]],Vars,Vars,true,nocut) :-
getvalue(Variable,Value,Vars),
(debug(on)->(writeln([call,[number,[Value]],"Press c."]),(not(get_single_char(97))->true;abort));true),
number(Value),
(debug(on)->(writeln([exit,[number,[Value]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretstatement1(_F0,_Functions,[variable,[Variable]],Vars,Vars,true,nocut) :-
var(Variable),
(debug(on)->(writeln([call,[variable,[Variable]],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[variable,[Variable]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretstatement1(_F0,_Functions,[Operator,[Variable1,Variable2]],Vars1,Vars2,true,nocut) :-
isop(Operator),
interpretpart(is,Variable1,Variable2,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[Operator,[Variable1,Variable2]],Vars1,Vars2,true,nocut) :-
%%writeln(31),
isop(Operator),
interpretpart(is,Variable2,Variable1,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[+,[Variable2,Variable3,Variable1]],Vars1,Vars2,true,nocut) :-
%%writeln(4),
interpretpart(isplus,Variable1,Variable2,Variable3,Vars1,Vars2).
%%interpretstatement1(_F0,_Functions,[Variable2+Variable3,is,Variable1],Vars1,Vars2,true,nocut) :-
%%writeln(41),
%%interpretpart(isplus,Variable1,Variable2,Variable3,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[=,[Variable1,[Variable2,Variable3]]],Vars1,Vars2,true,nocut) :-
%%writeln(5),
interpretpart(match,Variable1,Variable2,Variable3,Vars1,Vars2).
%%interpretstatement1(_F0,_Functions,[[Variable2,Variable3]=Variable1],Vars1,Vars2,true,nocut) :-
%%writeln(51),
%% interpretpart(match,Variable1,Variable2,Variable3,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[wrap,[Variable1,Variable2]],Vars1,Vars2,true,nocut) :-
%%writeln(52), wrap
interpretpart(bracket1,Variable1,Variable2,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[unwrap,[Variable1,Variable2]],Vars1,Vars2,true,nocut) :-
%%writeln(53), unwrap
interpretpart(bracket2,Variable1,Variable2,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[head,[Variable1,Variable2]],Vars1,Vars2,true,nocut) :-
%%writeln(6),
interpretpart(head,Variable1,Variable2,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[tail,[Variable1,Variable2]],Vars1,Vars2,true,nocut) :-
%%writeln(61),
interpretpart(tail,Variable1,Variable2,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[member,[Variable1,Variable2]],Vars1,Vars2,true,nocut) :-
%%writeln(8),
interpretpart(member,Variable1,Variable2,Vars1,Vars2).
interpretstatement1(_F0,_Functions,[delete,[Variable1,Variable2,Variable3]],Vars1,Vars2,true,nocut) :-
%%writeln(),
interpretpart(delete,Variable1,Variable2,Variable3,Vars1,Vars2).
%%** all in form f,[1,1,etc], including + with 0,1
interpretstatement1(_F0,_Functions,[append,[Variable1,Variable2,Variable3]],Vars1,Vars2,true,nocut) :-
%%writeln(9),
interpretpart(append,Variable1,Variable2,Variable3,Vars1,Vars2).
interpretstatement1(Functions0,_Functions,Query1,Vars1,Vars8,true,nocut) :-
%%writeln("h1/10"),
Query1=[Function,Arguments],
%%writeln(["Arguments",Arguments,"Vars1",Vars1]),
substitutevarsA1(Arguments,Vars1,[],Vars3,[],FirstArgs), %%% var to value, after updatevars: more vars to values, and select argument vars from latest vars
%%writeln([substitutevarsA1,arguments,Arguments,vars1,Vars1,vars3,Vars3,firstargs,FirstArgs]),
Query2=[Function,Vars3], %% Bodyvars2?
%% debug(on)->writeln([call,[Function,[Vars3]]]),
%%writeln(["Query2",Query2,"Functions0",Functions0]),
interpret2(Query2,Functions0,Functions0,Result1),
updatevars2(FirstArgs,Result1,[],Vars5),
updatevars3(Vars1,Vars5,Vars6),
reverse(Vars6,[],Vars7),
((not(Vars7=[])->
%%Vars7=[Var71|Vars72],
unique1(Vars7,[],Vars8)
);(
writeln(here1),
Vars8=[])).
%%**** reverse and take first instance of each variable.
%%findresult3(Arguments,Vars6,[],Result2)
%%writeln(["FirstArgs",FirstArgs,"Result1",Result1,"Vars5",Vars5,"Vars4",Vars4]),
%%writeln(["Vars1:",Vars1,"Vars4:",Vars4]),
%% debug(on)->writeln([exit,[Function,[Result2]]]).
interpretstatement1(Functions0,_Functions,Query,Vars,Vars,true) :-
Query=[_Function],
debug(on)->writeln([call,[Function]]),
interpret2(Query,Functions0,Functions0,_Result1),
debug(on)->writeln([exit,[Function]]).
interpretstatement1(_Functions0, _Functions,_Query,_Vars1,_Vars2,false) :-
writeln([false]).
interpretstatement2(Value,_Vars,Value) :-
(number(Value);atom(Value)).
interpretstatement2(Variable,Vars1,Value) :-
getvalue(Variable,Value,Vars1).
interpretstatement3(A + B,Vars,Value1) :-
interpretstatement2(A,Vars,Value2),
interpretstatement2(B,Vars,Value3),
Value1 = Value2 + Value3.
interpretstatement3(Value,_Vars,Value) :-
(number(Value);atom(Value)).
interpretstatement3(Variable,Vars,Value) :-
getvalue(Variable,Value,Vars).
getvalue(Variable,Value,Vars) :-
((not(isvar(Variable)),isvalstrorundef(Value),Variable=Value);
(isvar(Variable),isvalstrorundef(Value),getvar(Variable,Value,Vars))).
putvalue(Variable,Value,Vars1,Vars2) :-
((not(isvar(Variable)),isvalstrorundef(Value),Variable=Value);
(isvar(Variable),isvalstrorundef(Value),updatevar(Variable,Value,Vars1,Vars2))),!.
getvar(Variable,Value,Vars) :-
member([Variable,Value],Vars),
not(Value=empty).
getvar(undef,undef,_Vars) :-
!.
getvar(Variable,empty,Vars) :-
not(member([Variable,_Value],Vars));
member([Variable,empty],Vars).
updatevar(undef,_Value,Vars,Vars) :-
!.
updatevar(Variable,Value,Vars1,Vars2) :-
((((member([Variable,empty],Vars1),
delete(Vars1,[Variable,empty],Vars3),
append(Vars3,Variable,Value,Vars2));
((not(member([Variable,Value1],Vars1)),
((Value1=empty)->true;(Value1=Value)))),
append(Vars1,Variable,Value,Vars2));
(member([Variable,Value],Vars1),Vars2=Vars1));
(undef(Variable),
append(Vars1,Variable,Value,Vars2))).
updatevars(_FirstArgs,[],Vars,Vars).
updatevars(FirstArgs,Vars1,Vars2,Vars3) :-
Vars1=[[Variable1,Value]|Vars4],
((member([Variable2,Variable1],FirstArgs), %% removed brackets around firstargs here and 2 line below
append(Vars2,Variable2,Value,Vars5));
(member([Variable1,_Variable2],FirstArgs),
append(Vars2,Variable1,Value,Vars5))),
updatevars(FirstArgs,Vars4,Vars5,Vars3),
!.
updatevars(FirstArgs,Vars1,Vars2,Vars3) :-
Vars1=[_Vars4|Vars5],
updatevars(FirstArgs,Vars5,Vars2,Vars3).
updatevars2(_FirstArgs,[],Vars,Vars).
updatevars2(FirstArgs,Vars1,Vars2,Vars3) :-
Vars1=[[Variable,Value]|Vars4],
(member(Variable,FirstArgs), %% removed brackets around firstargs here and 2 line below, ** vars1 into arg in (10), check cond
append(Vars2,Variable,Value,Vars5)),
updatevars2(FirstArgs,Vars4,Vars5,Vars3).
updatevars3(Vars1,[],Vars1).
updatevars3(Vars1,Vars2,Vars4) :-
Vars2=[[Variable,Value]|Vars5],
delete(Vars1,[Variable,empty],Vars6),
append(Vars6,Variable,Value,Vars7),
updatevars3(Vars7,Vars5,Vars4),
!.
updatevars3(Vars1,Vars2,Vars4) :-
Vars2=[[Variable,Value]|Vars5],
append(Vars1,Variable,Value,Vars6),
updatevars3(Vars6,Vars5,Vars4).
reverse([],List,List).
reverse(List1,List2,List3) :-
List1=[Head|Tail],
append([Head],List2,List4),
reverse(Tail,List4,List3).
unique1([],Items,Items).
unique1([Item|Items1],Items2,Items3) :-
delete(Items1,Item,Items4),
append(Items2,[Item],Items5),
unique1(Items4,Items5,Items3).
isvar(Variable) :-
atom(Variable).
isval(Value) :-
number(Value).
isvalstr(N) :-
isval(N);string(N).
isvalempty(N) :-
isval(N);(N=empty).
/**isvalstrempty(N) :-
isval(N);(string(N);N=empty).**/
isvalstrempty(N) :-
isval(N).
isvalstrempty(N) :-
string(N).
isvalstrempty(empty).
/**isvalstrempty(N) :-
atom(N),fail,!.
**/
isvalstrorundef(N) :-
var(N),!.
isvalstrorundef(N) :-
not(var(N)),isval(N),!.
isvalstrorundef(N) :-
not(var(N)),expression(N),!.
undef(N) :-
var(N).
/**
expression(N) :-
isval(N);(string(N);atom(N)),!.
expression([]).
expression(empty).
expression([N]) :-
expression(N).
expression([N|Ns]):-
expression(N),expression(Ns).
**/
expression(empty) :-
!.
expression(N) :-
isval(N),!.
expression(N) :-
string(N),!.
expression(N) :-
atom(N),!.
expression([]) :-
!.
expression(N) :-
not(atom(N)),
length(N,L),L>=1,
expression2(N).
expression2([]).
expression2([N|Ns]) :-
expression3(N),
expression2(Ns).
expression3(N) :-
isval(N),!.
expression3(N) :-
string(N),!.
expression3(N) :-
atom(N),!.
expressionnotatom(N) :-
isvalstrempty(N),!.
expressionnotatom(N) :-
not(atom(N)),
length(N,L),L>=1,
expressionnotatom2(N).
expressionnotatom2([]).
expressionnotatom2([N|Ns]) :-
isvalstrempty(N),
expressionnotatom2(Ns).
substitutevarsA1(Arguments,Vars1,Vars2,Vars3,FirstArgs1,FirstArgs2) :-
substitutevarsA2(Arguments,Vars1,Vars2,Vars3,FirstArgs1,FirstArgs2).
substitutevarsA2([],_Vars1,Vars2,Vars2,FirstArgs,FirstArgs).
substitutevarsA2(Arguments,Vars1,Vars2,Vars3,FirstArgs1,FirstArgs2) :-
Arguments=[Variable|Variables],
((getvalue(Variable,Value,Vars1),
Value=empty)->
((append(Vars2,[Variable],Vars4)),
(isvar(Variable)->append(FirstArgs1,[Variable],
FirstArgs3);FirstArgs3=FirstArgs1));
(getvalue(Variable,Value,Vars1),
append(Vars2,[Value],Vars4)),
FirstArgs3=FirstArgs1),
substitutevarsA2(Variables,Vars1,Vars4,Vars3,FirstArgs3,FirstArgs2).
findresult3([],_Result,Result2,Result2).
findresult3(Arguments1,Result1,Result2,Result3) :-
Arguments1=[Value|Arguments2],
expressionnotatom(Value),
append(Result2,[Value],Result4),
findresult3(Arguments2,Result1,Result4,Result3).
findresult3(Arguments1,Result1,Result2,Result3) :-
Arguments1=[Variable|Arguments2],
isvar(Variable),
member([Variable,Value],Result1),
append(Result2,[Value],Result4),
findresult3(Arguments2,Result1,Result4,Result3).
listprologinterpreter3preds5.pl
interpretpart(is,Variable1,Variable2,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Value1,Value2,Vars1),
%%getvalue(Value1,Value1A,Vars1),
%%isvalstr(Value1),
%%isvalstr(Value1A),
expression(Value1),
expression(Value2),
val1emptyorvalsequal(Value1,Value2),
%%isval(Value2),
putvalue(Variable1,Value2,Vars1,Vars2),
(debug(on)->(writeln([call,[variable,is,Value2],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[Variable1,is,Value2],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(isplus,Variable1,Variable2,Variable3,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Variable3,Value1,Value2,Value3,Vars1),
isvalempty(Value1),
isval(Value2),
isval(Value3),
Value1A is Value2 + Value3,
val1emptyorvalsequal(Value1,Value1A),
putvalue(Variable1,Value1A,Vars1,Vars2),
(debug(on)->(writeln([call,[variable,is,Value2+Value3],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[Value1A,is,Value2+Value3],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(match,Variable1,Variable2,Variable3,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Variable3,Value1,Value2,Value3,Vars1),
Value1 = [Value2A, Value3A],
val1emptyorvalsequal(Value2,Value2A),
val1emptyorvalsequal(Value3,Value3A),
putvalue(Variable2,Value2A,Vars1,Vars3),
putvalue(Variable3,Value3A,Vars3,Vars2),
(debug(on)->(writeln([call,[[Value2A, Value3A],=,[variable1,variable2]],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[[Value2A, Value3A],=,[Value2A, Value3A]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(match,Variable1,Variable2,Variable3,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Variable3,Value1,Value2,Value3,Vars1),
Value1A = [Value2, Value3],
val1emptyorvalsequal(Value1,Value1A),
putvalue(Variable1,Value1A,Vars1,Vars2),
(debug(on)->(writeln([call,[variable,=,[Value2,Value3]],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[[Value2,Value3],=,[Value2,Value3]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(bracket1,Variable1,Variable2,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Value1,Value2,Vars1),
Value1A = [Value2],
val1emptyorvalsequal(Value1,Value1A),
%%val1emptyorvalsequal(Value1A,Value2),
putvalue(Variable1,Value1A,Vars1,Vars2),
(debug(on)->(writeln([call,[variable,=,[Value2]],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[Variable2,=,[Value2]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(bracket2,Variable1,Variable2,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Value1,Value2,Vars1),
Value1A = Value2,
val1emptyorvalsequal(Value1,Value1A),
%%val1emptyorvalsequal(Value2A,Value1),
putvalue(Variable1,Value1A,Vars1,Vars2),
(debug(on)->(writeln([call,[[variable],=,[Value2]],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[[Value2],=,[Value2]],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(head,Variable1,Variable2,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Value1,Value2,Vars1),
Value1=[Value1A|_Rest],
val1emptyorvalsequal(Value2,Value1A),
putvalue(Variable2,Value1A,Vars1,Vars2),
(debug(on)->(writeln([call,[head,Value1,variable],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[head,Value1,Value1A],"Press c."]),(not(get_single_char(97))->true;abort));true), !.
interpretpart(tail,Variable1,Variable2,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Value1,Value2,Vars1),
Value1=[_Head|Value1A],
%%removebrackets(Value1A,Value1B),
val1emptyorvalsequal(Value2,Value1A),
putvalue(Variable2,Value1A,Vars1,Vars2),
(debug(on)->(writeln([call,[tail,Value1,variable],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[tail,Value1,Value1A],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(member,Variable1,Variable2,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Value1,Value2,Vars1),
(not(Value1=empty)->(member(Value1,Value2),Vars2=Vars1,
(debug(on)->(writeln([call,[member,Value1,Value2],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[member,Value1,Value2],"Press c."]),(not(get_single_char(97))->true;abort));true));
(member(Value3,Value2),
putvalue(Variable1,Value3,Vars1,Vars2),
(debug(on)->(writeln([call,[member,variable1,Value2],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[member,Value3,Value2],"Press c."]),(not(get_single_char(97))->true;abort));true))).
interpretpart(delete,Variable1,Variable2,Variable3,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Variable3,Value1,Value2,Value3,Vars1),
delete(Value1,Value2,Value3A),
val1emptyorvalsequal(Value3,Value3A),
putvalue(Variable3,Value3A,Vars1,Vars2),
(debug(on)->(writeln([call,[delete,Value1,Value2,variable3],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[delete,Value1,Value2,Value3A],"Press c."]),(not(get_single_char(97))->true;abort));true).
interpretpart(append,Variable1,Variable2,Variable3,Vars1,Vars2) :-
getvalues(Variable1,Variable2,Variable3,Value1,Value2,Value3,Vars1),
append1(Value1,Value2,Value3A),
val1emptyorvalsequal(Value3,Value3A),
putvalue(Variable3,Value3A,Vars1,Vars2),
(debug(on)->(writeln([call,[append,Value1,Value2,variable3],"Press c."]),(not(get_single_char(97))->true;abort));true),
(debug(on)->(writeln([exit,[append,Value1,Value2,Value3A],"Press c."]),(not(get_single_char(97))->true;abort));true).
getvalues(Variable1,Variable2,Value1,Value2,Vars) :-
getvalue(Variable1,Value1,Vars),
getvalue(Variable2,Value2,Vars).
getvalues(Variable1,Variable2,Variable3,Value1,Value2,Value3,Vars) :-
getvalue(Variable1,Value1,Vars),
getvalue(Variable2,Value2,Vars),
getvalue(Variable3,Value3,Vars).
val1emptyorvalsequal(empty,_Value) :- !.
val1emptyorvalsequal(Value,Value) :-
not(Value=empty).
isop(is).
isop(=).
append1([],Item,Item) :-
!.
append1(Item1,Item2,Item3) :-
((isvalstr(Item1),Item1A=[Item1]);(not(isvalstr(Item1)),Item1A=Item1)),
((isvalstr(Item2),Item2A=[Item2]);(not(isvalstr(Item2)),Item2A=Item2)),
%%((isvalstr(Item3),Item3A=[Item3]);(not(isvalstr(Item3)),Item3A=Item3)),
append(Item1A,Item2A,Item3).
/**delete1(Item1,Item2,Item3) :-
((isvalstr(Item1),Item1A=[Item1]);(not(isvalstr(Item1)),Item1A=Item1)),
((isvalstr(Item2),Item2A=[Item2]);(not(isvalstr(Item2)),Item2A=Item2)),
%%((isvalstr(Item3),Item3A=[Item3]);(not(isvalstr(Item3)),Item3A=Item3)),
delete(Item1A,Item2A,Item3).
**/
removebrackets(Value,Value) :-!.
removebrackets(Value,Value).
lpiverify4.pl
%% test(Debug[on/off],Total,Score).
test(Debug,N29,S30) :- N22 is 0,S23 is 0,
N23 is N22+1,
%%writeln([eg1]),
((interpret(Debug,[function,[1,1,c]],
[
[function,[a,b,c],(:-),
[
[c,is,a+b]
]
]
]
,c, 2) ,S24 is S23 +1)->true;S24 is S23),
N24 is N23+1,
%%writeln([eg2]),
((interpret(Debug,[function,[1,1,c]],
[
[function,[a,b,c],(:-),
[
[d,is,a+b],
[c,is,d+1]
]
]
]
,c, 3), S25 is S24 +1)->true;S25 is S24),
N25 is N24+1,
%%writeln([eg3]),
((interpret(Debug,[function,[1,1,c]],
[
[function,[a,b,c],(:-),
[
[function2,[d,f]],
[e,is,a+b],
[g,is,e+f],
[c,is,g+d]
]
],
[function2,[a,f],(:-),
[
[a,is,2],
[f,is,1]
]
]
]
,c, 5), S26 is S25 +1)->true;S26 is S25),
N26 is N25+1,
%%writeln([eg4]),
((interpret(Debug,[append1,[a]],
[
[append1,[a],(:-),
[
[b,[b]],
[c,[c]],
[append,b,c,a]
]
],
[b,["b"]],
[c,["c"]]
]
,[[a, ["b", "c"]]]), S27 is S26 +1)->true;S27 is S26),
N27 is N26+1,
%%writeln([eg5]),
((
interpret(Debug,[count,[1,n]],
[
[count,[1,2]],
[count,[n,p],(:-),
[
[m,is,n+1],
[count,[m,p]]
]
]
] ,n, 2),S28 is S27 +1)->true;S28 is S27),
N28 is N27+1,
%%writeln([eg6]),
((
interpret(Debug,[count,[0,n]],
[
[count,[1,2]],
[count,[n,p],(:-),
[
[m,is,n+1],
[count,[m,p]]
]
]
] ,n, 2),S29 is S28 +1)->true;S29 is S28),
N29 is N28+1,
%%writeln([eg7]),
((
interpret(Debug,[reverse,[[1,2,3],[],l]],
[
[reverse,[[],l,l]],
[reverse,[l,m,n],(:-),
[ [head,l,h],
[tail,l,t],
[append,h,m,o],
[reverse,[t,o,n]]
]
]
],[[l, [3, 2, 1]]]),S30 is S29 +1)->true;S30 is S29).
/**
- /