View file src/lpian/exn.lpi - Download


(



(def CLAUSE : ARG args : ARG corps @:
	CONS 'APPLYTO
	LIST1
	CONS 'REP CONS 'QUOTE CONS CONS %args %corps ':
	RENAME REP DES CAR UNIFPROLOG
	DES GETH 1 CDR EXEC :
	GETH 1 CAR MON UNIFPROLOG
	GETENV REP CONSTR SETENV
	MON VARIABLES GETENV UNBINDVENV SETENV)

(def UNIFPROLOG : GETENV UNIF REP THEN SETENV END)

(def LIST1 : ARG x %(x))

(def defclause : C QUOTE : C QUOTE : C QUOTE :
		 ARG corps : ARG args : ARG pred :
	%corps %args CLAUSE ARG clause :
	%pred DECLSYM GETDEF NOT
		THEN (%clause %pred SETDEF) :
        %pred GETDEF GETTYPE 1 EQ 
        THEN (%clause %pred SETDEF) : 
	'() %clause CONS %pred GETDEF CONS 'ALT CONS 
        NL
        "defclause " PRINTSTRING 
        %pred PRIN 
        " " PRINTSTRING 
        %args PRIN
        " " PRINTSTRING
        %corps PRIN
        " -> " PRINTSTRING
        REP PRINT
        NL
        %pred SETDEF)

(defclause plappend (() &l &l) I)

(defclause plappend ((&x . &a) &b (&x . &c)) :
	plappend '(&a &b &c))

(def plappend1 :
	ALT
	(APPLYTO : REP '((() &l &l) . I) :
	 RENAME REP DES CAR UNIFPROLOG
	 DES GETH 1 CDR EXEC :
	 GETH 1 CAR MON UNIFPROLOG
	 GETENV REP CONSTR SETENV
	 MON VARIABLES GETENV UNBINDVENV SETENV)
	(APPLYTO : REP '(((&x . &a) &b (&x . &c)) plappend '(&a &b &c)) :
	 RENAME REP DES CAR UNIFPROLOG
	 DES GETH 1 CDR EXEC :
	 GETH 1 CAR MON UNIFPROLOG
	 GETENV REP CONSTR SETENV
	 MON VARIABLES GETENV UNBINDVENV SETENV))

{
(ALT (plappend '((a b c) (d e) &x) :
	%x PRINT END)
	I)
} 
{ (a b c d e) }

{
(ALT (plappend '(&x &y (a b c d e))
	%x PRIN %y PRINT END)
	I)
}

{
()(a b c d e)
(a)(b c d e)
(a b)(c d e)
(a b c)(d e)
(a b c d)(e)
(a b c d e)()
}


(def INTERP :
	Y :
	REP NCONSPTHEN EXIT :
	REP CAR PREMINSTR 'STOP EQ THEN EXIT :
	EVOL-LCTXS)
 

(def NCONSPTHEN : CONSP NOT THEN) 

(def PREMINSTR : ARG (() (x)) %x)

(def EVOL-LCTXS :
	REP CAR EVOL ECH CDR ECH INSLCTXS)

(def ONEOF :
	REP NCONSPTHEN END :
	ALT CAR : CDR ONEOF)


{ (30 149 SETREG) } 

(def MOTEUR-NOTRACE : ARG objectif : ARG regles :
	REPEAT
		(%regles ONEOF GETDEF EXEC
		TEST-BASE THEN END I
		 { on verifie qu'on n'est pas dans un etat deja rencontre }
		)
	%objectif EXEC)

(def TRACE-MOTEUR '())

(def MAPK : C Q : ARG _f : ARG _x : ARG _l :
	%_l NCONSPTHEN I :
	%_l CAR %_x %_f EXEC :
	%_l CDR %_x '() %_f CONS Q MAPK CONS EXEC) 

(def PRINTSOL : %SOL PRINTSOL1)

(def PRINTSOL1 : ARG sol :
	"Solution : " PRINTSTRING NL
	%sol '() MAPK : ARG x : ARG (regle env) :
	"    Regle " PRINTSTRING %regle PRIN " , env = " PRINTSTRING NL  
	%env PRINTENVBASE)

(def PRINTENV : ARG env :
	%env '() MAPK : ARG x : ARG (var . vals) :
	"        " PRINTSTRING %var PRIN " = " PRINTSTRING %vals PRINT)

(def PRINTENVBASE : ARG env :
	"        BASE = " PRINTSTRING
	'BASE %env GETVENV PRINT)	

(def MOTEUR : ARG objectif : ARG regles :
	TRACE-MOTEUR THEN ("Regles : " PRINTSTRING %regles PRINT) I
	REPEAT
	      ( TRACE-MOTEUR THEN ("Debut repeat: Base " PRINTSTRING %BASE PRINT) I
		TRACE-MOTEUR THEN ("regles : " PRINTSTRING %regles PRINT) I 
		%regles ONEOF { REP PRINT } 
		TRACE-MOTEUR THEN (READSTRING DEP {0 ECH CREF 115 EQ THEN STEPON I}
				   NL "Base " PRINTSTRING %BASE PRINT
				   "Regle " PRINTSTRING REP PRINT) I
		GETDEF EXEC
		TRACE-MOTEUR THEN ("base " PRINTSTRING %BASE PRINT
				   {"sol  " PRINTSTRING %SOL PRINT}
				   %SOL PRINTSOL) I
		TEST-BASE THEN 
			("Deja rencontre" PRINTSTRING NL END)
			(TRACE-MOTEUR THEN
                                ("Nouveau" PRINTSTRING NL) I I)
		 { on verifie qu'on n'est pas dans un etat deja rencontre }
		)
	TRACE-MOTEUR THEN ("Apres REPEAT, base " PRINTSTRING %BASE PRINT) I
	%objectif EXEC
	TRACE-MOTEUR THEN ("Apres objectif, base " PRINTSTRING %BASE PRINT) I)

(def REPEAT : B (ALT I) (S I REPEAT))

(def TEST-BASE :
	%SOL CDR %BASE CONTIENT :
	ARG base : ARG (regle env) :
	'BASE %env GETVENV %base MEMES-BASES)

{ (def MEMES-BASES EQUAL) }
(def MEMES-BASES : ARG b1 : ARG b2 : 
        (%b1 %b2 INCL) AND
        (%b2 %b1 INCL))

{
(def CONTIENT :
	C QUOTE : DES DES DES
	(GETH 0 NCONSPTHEN '() :
	 GETH 0 CAR GETH 1 GETH 2 EXEC :
	 OR :
	 GETH 0 CDR GETH 1
	 '() GETH 2 CONS 'CONTIENT CONS EXEC)
	MONDEP MONDEP MONDEP)
}

(def OR : B (REP THEN I) DEP)

(def defregle : C QUOTE : C QUOTE : C QUOTE :
		ARG corps : ARG vars : ARG nom :
	%corps %vars %nom REGLE
	%nom DECLSYM SETDEF)

(def REGLE : ARG nom : ARG vars : ARG corps :
	%('QUOTE 'UNDEFINED 'BINDVQ vars
	  corps
	  ('%SOL 'QUOTE '() 'GETENV 'CONS 'QUOTE nom 'CONS 'CONS
	   'SETVQ 'SOL)
	   { mise a jour de la solution : ajoute (nom-regle vars) en tete }
	   'UNBINDVQ vars))

(def fait : APPLYTO :
	%BASE ONEOF ECH UNIFIER)

(def UNIFIER :
	GETENV UNIF REP THEN SETENV END)

(def ajouter : APPLYTO :
	GETENV CONSTR
	%BASE ECH CONS SETVQ BASE)

(def supprimer : APPLYTO :
	REP
	%BASE ONEOF REP ECH3 UNIFIER
	%BASE ECH REMQ SETVQ BASE)

(def ECH3 : ARG a : ARG b : ARG c : %a %b %c)

(def REMQ : ARG x : ARG l :
	%l CAR %x EQ THEN (%l CDR) :
	%l CDR %x REMQ %l CAR CONS)


(def base-init-lcc ':
	((homme toto) sur (rive gauche))
	((loup loulou) sur (rive gauche))
	((chevre blanchette) sur (rive gauche))
	((chou chou1) sur (rive gauche))
	((rive gauche) proche (rive droite))
	((rive droite) proche (rive gauche))
)

(defregle objectif-lcc () :
	fait '((homme toto) sur (rive droite))
	fait '((loup loulou) sur (rive droite))
	fait '((chevre blanchette) sur (rive droite))
	fait '((chou chou1) sur (rive droite))
)

(defregle manger () :
	fait '((chevre &()) sur (rive &r))
	{ "chevre sur rive " PRINTSTRING %r PRINT }
	(ALT (fait '((loup &()) sur (rive &r)) { 'loup PRINT } )
	     (fait '((chou &()) sur (rive &r)) { 'chou PRINT } ))
	prolognot (fait '((homme &()) sur (rive &r)) { 'homme PRINT } )
)

(defregle regle1-lcc (h d a) :
	supprimer '((homme &h) sur (rive &d))
	fait '((rive &d) proche (rive &a))
	ajouter '((homme &h) sur (rive &a))
	prolognot manger
        "homme traverse seul de rive " PRINTSTRING %d PRIN " vers rive " PRINTSTRING %a PRINT
)

(defregle regle2-lcc (h o d a) :
	supprimer '((homme &h) sur (rive &d))
	supprimer '(&o sur (rive &d))
	fait '((rive &d) proche (rive &a))
	ajouter '((homme &h) sur (rive &a))
	ajouter '(&o sur (rive &a))
	prolognot manger
        "homme traverse avec " PRINTSTRING %o PRIN " de rive " PRINTSTRING %d PRIN " vers rive " PRINTSTRING %a PRINT
)

(def LCC :
	base-init-lcc : ARG BASE :
	'true : ARG SOL :
	'(regle1-lcc regle2-lcc) 'objectif-lcc MOTEUR
	PRINTSOL
	Y : READ EXEC)

(base-init-lcc SETVQ BASE)

{ (def PRINTSOL PRINT) }

(def RPTN :
	B (1 PLUS Y) : #-1 PLUS REP ZEROP THEN (K I))

(def NEW-MKCNL :
	'() ECH CONS
	%('CANAL '() '()) APPEND)



(def VALUEINCTX :
	DES DES
	(GETCTX :
         ENLINSTR
	 GETH 0
		'THROW AJINSTR
		ECH AJINSTR
		'QUOTE AJINSTR
		GETH 1 AJINSTR
	 SETCTX)
	MONDEP MONDEP)

(synonym KI J)

(def freeze :
	GETCTX : ENLINSTR KI)

(def UNFREEZE :
	REP ENLINSTR ECH PREMINSTR
	VALUEINCTX)


(def INTFROM : ARG n :
	freeze : %n 1 PLUS INTFROM %n CONS)

(def CHEMIN : ARG lab : ARG dv : ARG arr : ARG dep :
        "chemin de " PRINTSTRING %dep PRIN " a " PRINTSTRING %arr PRIN " dv=" PRINTSTRING %dv PRINT
	%dep %dv MEMBER THEN END :
	%dep %arr EQUAL THEN 'true :
	%dep %lab GETVENV ONEOF :
	ARG (dir nv) :
	%nv %arr %(dep . dv) %lab CHEMIN
	%dir CONS)

(def CHEMINS :
	values CHEMIN
	DES DES DEP DEP DEP MON)

(def UNCHEMIN :
	cut : ALT CHEMIN : DEP DEP DEP DEP '())

(def lab1 ':
	(A : (e B))
	(B : (n E) (e C))
	(C : )
	(D : (s A))
	(E : (o D) (n H) (e F))
	(F : (s C))
	(G : (s D))
	(H : (o G) (e I))
	(I : (s F))
)


(def LINK-LABEL 'label)
(def LINK-GOTO 'goto)

(def LINK : LIST1 LINK1 CAR)

(def LINK1 :
	'() ARG labels :
	LINK2 ARG y :
	'() ARG linked :
	%y LINK3
	(Y :
		%linked NOT THEN EXIT :
		'() SETVQ linked
		%y LINK3)
	%y)

(def LINK2 : ARG x :
	%x NCONSPTHEN %x :
	(%x CAR NCONSPTHEN '() :
	 %x CAR CAR LINK-LABEL EQ)
	THEN (%x CDR LINK2 ARG y :
		@(labels SETVQ
			CONS CONS CAR CDR CAR %x CONS %y '()
				%labels)
		%y) :
	@:CONS LINK2 CAR %x LINK2 CDR %x)

(def LINK3 :
	'() SETVQ LINK-DEJAVU
	LINK4)

(def LINK4 : ARG x :
	%x %LINK-DEJAVU MEMQ THEN I :
	%x NCONSPTHEN I :
	%LINK-DEJAVU %x CONS SETVQ LINK-DEJAVU
	%x CAR LINK4 %x CDR LINK4
	(%x CAR NCONSPTHEN '() :
	 %x CAR CAR NCONSPTHEN '() :
	 LINK-GOTO %x CAR CAR CAR EQ)
	THEN ('true SETVQ linked
		%x CAR CAR CDR CDR %labels GETVENV
		%x RPLACA) :
	(%x CDR NCONSPTHEN '() :
	 %x CDR CAR NCONSPTHEN '() :
	 LINK-GOTO %x CDR CAR CAR EQ)
	THEN ('true SETVQ linked
		%x CDR CAR CDR CAR %labels GETVENV
		%x RPLACD)
	I)



{ (definstr nom corps) -> (def nom : GETCTX : ENLINSTR corps SETCTXS) }



(def definstr : C QUOTE : C QUOTE : ARG corps : ARG nom @:
	SETDEF DECLSYM %nom
	%('GETCTX ('ENLINSTR corps 'SETCTXS)))

(definstr INSTR-DEUXIEME : ARG ctx :
	%ctx DEPIL %ctx SOMPIL CDR CAR EMPIL LIST1)

(definstr instr : ARG (strat (f . prog) . sc) :
	%(strat prog . sc) %f EXEC)

(def INSTR-TROISIEME : instr : ARG ctx :
	%ctx DEPIL %ctx SOMPIL CDR CDR CAR EMPIL LIST1)


(def INTERP : Y :
 	{ REP LENGTH PRINT REP CAR PRINTCTX READSTRING DEP }
	REP NCONSPTHEN EXIT :
	REP CAR PREMINSTR
	REP 'STOP EQ THEN (DEP EXIT) :
	REP 'META-APPLY EQ
		THEN (DEP :
			ARG ((strat (() f . prog) (x . bas) fh
				. sc) . ac) :
			%x %f EXEC : ARG y :
			%((strat prog (y . bas) fh . sc) . ac)) :
	REP 'META EQ
		THEN (DEP REP CDR ECH CAR ENLINSTR REP PREMINSTR EXEC
			(ENLINSTR REP ENLINSTR ENLINSTR ECH PREMINSTR
				AJINSTR CONS)
			ENLINSTR ENLINSTR CONS) :
	REP 'GETLCTXS EQ
		THEN (DEP ARG ((strat (() . prog) bas fh . sc) . ac) :
			%((strat prog (((strat prog bas fh . sc)
						. ac) . bas) fh
				. sc) . ac)) :
	REP 'LEVEL EQ
		THEN (DEP ARG ((strat (() . prog) bas fh . sc) . ac) :
			LEVEL 1 PLUS : ARG l :
			%((strat prog (l . bas) fh . sc) . ac)) :
	DEP EVOL-LCTXS)


(def EVOL-LCTXS : REP CAR EVOL ECH CDR ECH INSLCTX)
(def META-VALUE : B ('() META-APPLY) DEP)
(def META-EXEC : META-APPLY EXEC)
(def META-EVAL : C META-VALUE EXEC)
(def NEW-META : B META-EVAL : P 'K 'KI)

(def shiftup : GETCTX : ENLINSTR LIST1 : Y : EVOL-LCTXS)
(def SHIFTUP1 : GETCTX : ENLINSTR LIST1 : INTERP)
(def SHIFTUP : B GETCTX : ENLINSTR LIST1 INTERP)

{
(def GETGCTXS :
	GETROOT CAR CDR CAR CDR
	CDR GETCTX : ENLINSTR DEPIL CONS)
(def SETGCTXS : GETROOTR CAR CDR CAR RPLACD)
(def GCUT : '() GETROOT CAR CDR CAR CDR RPLACD)
}

(def GSHIFTUP : B GETCTXS : GCUT REP CDR ECH CAR ENLINSTR CONS INTERP)

(def SHIFTDOWN1 : GETCTX / ENLINSTR META-APPLY SETCTX)
(def SHIFTDOWN : GETCTX : ENLINSTR META-APPLY (ALT SETCTX I) END)

(def /REPEVOL :
	INTERP
	REP NCONSPTHEN I :
	REP CDR ECH CAR ENLINSTR CONS)

(def /APPLIQ :
	'() 'STOP CONS ECH CONS AJINSTR LIST1 /REPEVOL)

(def /APPREMINSTR :
	REP ENLINSTR ECH PREMINSTR /APPLIQ)

(def *REPEVOL :
	/REPEVOL
	REP NCONSPTHEN I :
	REP CDR *REPEVOL ECH CAR CONS)

(def *APPLIQ :
	'() 'STOP CONS ECH CONS AJINSTR LIST1 *REPEVOL)

(def *APPLIQ :
	'() 'STOP CONS ECH CONS AJINSTR LIST1 *REPEVOL)

(def *APPREMINSTR :
	REP ENLINSTR ECH PREMINSTR *APPLIQ)

(definstr values : ARG ctx :
	%ctx *APPREMINSTR
	'() MAPKAR (DEP SOMPIL)
	%ctx ENLINSTR ECH EMPIL LIST1)

(definstr cut :
	/APPREMINSTR CAR LIST1)

(definstr bloc
	*APPREMINSTR)

(definstr hyp : ARG ctx :
	%ctx /APPREMINSTR NCONSPTHEN '() (%ctx ENLINSTR LIST1))

(definstr prolognot : ARG ctx :
	%ctx /APPREMINSTR NCONSPTHEN (%ctx ENLINSTR LIST1) '())

(definstr prologif : ARG ctx :
	%ctx : ARG (strat (c x y . prog) . sc) :
	%(strat prog . sc) %c *APPLIQ : ARG lctxs :
	%lctxs NCONSPTHEN %((strat (y . prog) . sc)) :
	%lctxs %x MAPKAR AJINSTR)

{
(defprop META _NDF : SHIFTUP (DEP KI) META)
(defprop META-APPLY _NDF : SHIFTUP (DEP KI) META-APPLY)
}

(def tour-reflexive1 :
(defprop META _NDF : SHIFTUP SETCTXS META)
(defprop META-APPLY _NDF : SHIFTUP SETCTXS META-APPLY)
(defprop TOP _NDF I)
(defprop LEVEL _NDF 0)
)

(def tour-reflexive2 :
(defprop META _NDF : GSHIFTUP SETCTXS META)
(defprop META-APPLY _NDF : GSHIFTUP SETCTXS META-APPLY)
(defprop STOP _NDF I)
)

(defprop LEVEL _NDF 0)
(defprop GETLCTXS _NDF GETGCTXS)



)