unit umain;

interface
const
	p_draw	= 1 ;
	p_drawpol	= 2 ;
	p_fillpattern	= 3 ;
	p_iniwindow	= 4 ;
	p_store	= 5 ;
	p_p_until	= 6 ;
	p_rp_arg	= 7 ;
	p_substr	= 8 ;
	p_del4	= 9 ;
	p_insert	= 10 ;
	p_circle	= 11 ;
	p_replace	= 12 ;
	p_user4	= 13 ;
	p__readlhm	= 14 ;
	p_turtlewindow	= 15 ;
	p_polyinc	= 16 ;
	p_polyrap	= 17 ;
	p_fillshape	= 18 ;
	p_fillpol	= 19 ;
	p_logo	= 20 ;
	p_p_string	= 21 ;
	p_p_integer	= 22 ;
	p_p_ident	= 23 ;
	p_conc	= 24 ;
	p_union	= 25 ;
	p_inter	= 26 ;
	p_complement	= 27 ;
	p_left	= 28 ;
	p_right	= 29 ;
	p_arg	= 30 ;
	p_functor	= 31 ;
	p_locat3	= 32 ;
	p_op	= 33 ;
	p_for	= 34 ;
	p_plot	= 35 ;
	p_plotpol	= 36 ;
	p_findall	= 37 ;
	p_f_diff	= 38 ;
	p_write_format	= 39 ;
	p_user3	= 40 ;
	p_limot3	= 41 ;
	p_licar3	= 42 ;
	p_readlhm	= 43 ;
	p_wlhm	= 44 ;
	p_ast3_before	= 45 ;
	p_ast3_after	= 46 ;
	p_repl3	= 47 ;
	p_retr3	= 48 ;
	p_retr3_from	= 49 ;
	p_anafact	= 50 ;
	p_poly	= 51 ;
	p_setp	= 52 ;
	p_draw3	= 53 ;
	p_draw3pol	= 54 ;
	p_plus	= 55 ;
	p_moins	= 56 ;
	p_mul	= 57 ;
	p_divise	= 58 ;
	p_puiss	= 59 ;
	p_egalu	= 60 ;
	p_diffu	= 61 ;
	p_diff	= 62 ;
	p_petit	= 63 ;
	p_pet	= 64 ;
	p_grand	= 65 ;
	p_egapetit	= 66 ;
	p_grandega	= 67 ;
	p_affecu	= 68 ;
	p_affece	= 69 ;
	p_affecs	= 70 ;
	p_funclist	= 71 ;
	p_func	= 72 ;
	p_egal	= 73 ;
	p_noega	= 74 ;
	p_petitega	= 75 ;
	p_petega	= 76 ;
	p_egagrand	= 77 ;
	p_div	= 78 ;
	p_mod	= 79 ;
	p_locat2	= 80 ;
	p_getcolor	= 81 ;
	p_getdot	= 82 ;
	p_point	= 83 ;
	p_concat	= 84 ;
	p_clause	= 85 ;
	p_cursor	= 86 ;
	p_and	= 87 ;
	p_or	= 88 ;
	p_xor	= 89 ;
	p_function	= 90 ;
	p_value	= 91 ;
	p_valuen	= 92 ;
	p_p_space	= 93 ;
	p_element	= 94 ;
	p_el_one	= 95 ;
	p_listens	= 96 ;
	p_inclus	= 97 ;
	p_compens	= 98 ;
	p_inverse	= 99 ;
	p_miroir	= 100 ;
	p_flat	= 101 ;
	p_second	= 102 ;
	p_first2	= 103 ;
	p_last2	= 104 ;
	p_reste	= 105 ;
	p_pushfirst	= 106 ;
	p_pushlast	= 107 ;
	p_pushdiff	= 108 ;
	p_pop	= 109 ;
	p_pop_one	= 110 ;
	p_reset	= 111 ;
	p_rewrite	= 112 ;
	p_rdcar2	= 113 ;
	p_limot2	= 114 ;
	p_licar2	= 115 ;
	p_line	= 116 ;
	p_space	= 117 ;
	p_status2	= 118 ;
	p_name	= 119 ;
	p_s_txt2	= 120 ;
	p_copy	= 121 ;
	p_trie	= 122 ;
	p_assert	= 123 ;
	p_assrt_first	= 124 ;
	p_asrt_before	= 125 ;
	p_asrt_after	= 126 ;
	p_retract	= 127 ;
	p__retract	= 128 ;
	p_repl2	= 129 ;
	p_erase	= 130 ;
	p_until2	= 131 ;
	p_index2	= 132 ;
	p_sound2	= 133 ;
	p_user2	= 134 ;
	p_dir2	= 135 ;
	p_wformat	= 136 ;
	p_menu	= 137 ;
	p_wtitle	= 138 ;
	p_wind2	= 139 ;
	p_pchr	= 140 ;
	p_hlp2	= 141 ;
	p_setposition	= 142 ;
	p_fshape	= 143 ;
	p_fsh3d	= 144 ;
	p_putln	= 145 ;
	p_put	= 146 ;
	p_write	= 147 ;
	p_writeln	= 148 ;
	p_wwords	= 149 ;
	p_wwln	= 150 ;
	p_read	= 151 ;
	p_readln	= 152 ;
	p_putval	= 153 ;
	p_round	= 154 ;
	p_trunc	= 155 ;
	p_fact	= 156 ;
	p_ln	= 157 ;
	p_log	= 158 ;
	p_exp	= 159 ;
	p_sin	= 160 ;
	p_cos	= 161 ;
	p_tg	= 162 ;
	p_sign	= 163 ;
	p_abs	= 164 ;
	p_param_line	= 165 ;
	p_moinsu	= 166 ;
	p_arctg	= 167 ;
	p_arccos	= 168 ;
	p_arcsin	= 169 ;
	p_sh	= 170 ;
	p_ch	= 171 ;
	p_th	= 172 ;
	p_arcsh	= 173 ;
	p_arcch	= 174 ;
	p_arcth	= 175 ;
	p_ord	= 176 ;
	p_option	= 177 ;
	p_length	= 178 ;
	p_sqrt	= 179 ;
	p_frac	= 180 ;
	p_inte	= 181 ;
	p_random	= 182 ;
	p_list	= 183 ;
	p_edt	= 184 ;
	p_edit	= 185 ;
	p_number	= 186 ;
	p_numeric	= 187 ;
	p_num	= 188 ;
	p_ident	= 189 ;
	p_structure	= 190 ;
	p_liste	= 191 ;
	p_var	= 192 ;
	p_novar	= 193 ;
	p_constante	= 194 ;
	p_integer	= 195 ;
	p_lettre	= 196 ;
	p_chiffre	= 197 ;
	p_special	= 198 ;
	p_real	= 199 ;
	p_input1	= 200 ;
	p_lire	= 201 ;
	p_relire	= 202 ;
	p_verifie	= 203 ;
	p_outpt1	= 204 ;
	p_seed	= 205 ;
	p_execute	= 206 ;
	p_uper	= 207 ;
	p_lower	= 208 ;
	p_compact	= 209 ;
	p_save_bin	= 210 ;
	p_load_bin	= 211 ;
	p_delay	= 212 ;
	p_sound	= 213 ;
	p_first1	= 214 ;
	p_last1	= 215 ;
	p_vide	= 216 ;
	p_close	= 217 ;
	p_readcar	= 218 ;
	p_readkbd	= 219 ;
	p_inkey	= 220 ;
	p_liremots	= 221 ;
	p_lirecars	= 222 ;
	p_werror	= 223 ;
	p_read_modify	= 224 ;
	p_menu1	= 225 ;
	p_eof1	= 226 ;
	p_not_eof	= 227 ;
	p_eoln1	= 228 ;
	p_neoln	= 229 ;
	p_stat1	= 230 ;
	p_type	= 231 ;
	p_delete	= 232 ;
	p_dir	= 233 ;
	p_purge	= 234 ;
	p_setdir	= 235 ;
	p_supprime	= 236 ;
	p_time	= 237 ;
	p_date	= 238 ;
	p_spy	= 239 ;
	p_nospy	= 240 ;
	p_coupe1	= 241 ;
	p_block	= 242 ;
	p_fail1	= 243 ;
	p_repet1	= 244 ;
	p_until1	= 245 ;
	p_succ1	= 246 ;
	p_if	= 247 ;
	p_not	= 248 ;
	p_module	= 249 ;
	p_define	= 250 ;
	p_external	= 251 ;
	p_clear	= 252 ;
	p_help	= 253 ;
	p_hlp	= 254 ;
	p_print1	= 255 ;
	p_stxt_module	= 256 ;
	p_stxt_all	= 257 ;
	p_array	= 258 ;
	p_textmode	= 259 ;
	p_textcolor	= 260 ;
	p_backcolor	= 261 ;
	p_palette	= 262 ;
	p_graphback	= 263 ;
	p_window	= 264 ;
	p_user1	= 265 ;
	p_mark	= 266 ;
	p_hsh_coded	= 267 ;
	p_multi_hsh_coded	= 268 ;
	p_index1	= 269 ;
	p_w_title	= 270 ;
	p_w_date	= 271 ;
	p_w_time	= 272 ;
	p_razlhm	= 273 ;
	p_put_chr	= 274 ;
	p_get_ord	= 275 ;
	p_prompt	= 276 ;
	p_ref_ident	= 277 ;
	p_fillscreen	= 278 ;
	p_hirescolor	= 279 ;
	p_turnright	= 280 ;
	p_turnleft	= 281 ;
	p_backward	= 282 ;
	p_forward	= 283 ;
	p_setheading	= 284 ;
	p_setpencolor	= 285 ;
	p_tdelay	= 286 ;
	p_forwa3d	= 287 ;
	p_backw3d	= 288 ;
	p_tourner3d	= 289 ;
	p_tourx	= 290 ;
	p_toury	= 291 ;
	p_tourz	= 292 ;
	p_loop	= 293 ; (*tanguer3d*)
	p_noloop	= 294 ;	(*roulis3d *)
	p_magnify	= 295 ;
	p_focal	= 296 ;
	p_getpic	= 297 ;
	p_putpic	= 298 ;
	p_coupe0	= 299 ;
	p_nil	= 300 ;
	p_fail0	= 301 ;
	p_repet0	= 302 ;
	p_succ0	= 303 ;
	p_if0	= 304 ;
	p_then	= 305 ;
	p_else	= 306 ;
	p_end	= 307 ;
	p_ffor	= 308 ;
	p_exit	= 309 ;
	p_quit	= 310 ;
	p_cl_all	= 311 ;
	p_cl_module	= 312 ;
	p_echo	= 313 ;
	p_noecho	= 314 ;
	p_auto	= 315 ;
	p_noauto	= 316 ;
	p_trace	= 317 ;
	p_notrace	= 318 ;
	p_fait	= 319 ;
	p_nofait	= 320 ;
	p_silent	= 321 ;
	p_nosilent	= 322 ;
	p_beep	= 323 ;
	p_clrscr	= 324 ;
	p_clreol	= 325 ;
	p_clrtoend	= 326 ;
	p_inslin	= 327 ;
	p_dellin	= 328 ;
	p_stop	= 329 ;
	p_continue	= 330 ;
	p_cont	= 331 ;
	p_videoinv	= 332 ;
	p_videonor	= 333 ;
	p_input0	= 334 ;
	p_outpt0	= 335 ;
	p_print	= 336 ;
	p_keyboard	= 337 ;
	p_console	= 338 ;
	p_eof0	= 339 ;
	p_eoln0	= 340 ;
	p_stat	= 341 ;
	p_clear_stat	= 342 ;
	p_id_predef	= 343 ;
	p_id_module	= 344 ;
	p_id_all	= 345 ;
	p_id_main	= 346 ;
	p_id_undef	= 347 ;
	p_flag	= 348 ;
	p_list_all	= 349 ;
	p_list_module	= 350 ;
	p_ref_module	= 351 ;
	p_ref_all	= 352 ;
	p_prin_module	= 353 ;
	p_prin_all	= 354 ;
	p_lire0	= 355 ;
	p_wait	= 356 ;
	p_spawn	= 357 ;
	p_wherex	= 358 ;
	p_wherey	= 359 ;
	p_ioresult	= 360 ;
	p_max_fait	= 361 ;
	p_pi	= 362 ;
	p_xturtle	= 363 ;
	p_yturtle	= 364 ;
	p_xtur3d	= 365 ;
	p_ytur3d	= 366 ;
	p_ztur3d	= 367 ;
	p_pxturtle3d	= 368 ;
	p_pyturtle3d	= 369 ;
	p_there	= 370 ;
	p_pencolor	= 371 ;
	p_heading	= 372 ;
	p_index	= 373 ;
	p_nocolor	= 374 ;
	p_graphcolor	= 375 ;
	p_graphmode	= 376 ;
	p_hires	= 377 ;
	p_all	= 378 ;
	p_help0	= 379 ;
	p_end_module	= 380 ;
	p_main	= 381 ;
	p_edit_module	= 382 ;
	p_edit_all	= 383 ;
	p_unmark	= 384 ;
	p_nosound	= 385 ;
	p_dir0	= 386 ;
	p_noaccent	= 387 ;
	p_int0	= 388 ;
	p_real0	= 389 ;
	p_word	= 390 ;
	p_words	= 391 ;
	p_oblig	= 392 ;
	p_facul	= 393 ;
	p_yes	= 394 ;
	p_no	= 395 ;
	p_yesno	= 396 ;
	p_color	= 397 ;
	p_next	= 398 ;
	p_numerote	= 399 ;
	p_Ctrlz	= 400 ;
	p_r_modify	= 401 ;
	p_wdate	= 402 ;
	p_wtime	= 403 ;
	p_clearscreen	= 404 ;
	p_hideturtle	= 405 ;
	p_hometurtle	= 406 ;
	p_nowrap	= 407 ;
	p_pendown	= 408 ;
	p_penup	= 409 ;
	p_showturtle	= 410 ;
	p_wrap	= 411 ;
	p_logomode	= 412 ;
	p_prologmode	= 413 ;
	p_txtmode	= 414 ;
	p_forgetdraw	= 415 ;
	p_hardcopy	= 416 ;
	p_impon	= 417 ;
	p_impoff	= 418 ;
	p_cursoff	= 419 ;
	p_curson	= 420 ;

        p_nombre=-1;
	p_int=-2;
	lstr = 150;		(* longueur d'une phrase *)

	lig_bas = 24;
	max_sym = 2100;		(* nombre de symboles *)
	nfait_paq =500;		(* nombre de faits par paquets *)
	max_arbre= 5000;	(* nombre d'elements d'arbres *)
	max_env= 100000;	(* nombre d'environnements *)
	max_glob= 1500;		(* nombre de noeuds globaux *)
	max_noeud= 4500;	(* nombre de noeuds locaux *)
	ncmot=80;		(* nombre de caracteres par symbole *)
	max_lig= 200;		(* nombre de lignes pour l'editeur *)
	max_com = 8;		(* nombre de commandes rappellables *)

	max_hsh		=148;	(* taille de la table de hshcode dico*)
	max_par		=10;	(* nombre max de paramètre *)
	max_hsh_coded	=100;	(* nombre max de relations hsh codables *)
	max_coded	=31;	(* nombre de valeurs de hsh coded *)
	mx_coded	=32;
	m_cond		=30;	(* nombre de conditions dans un elem de fait*)
	max_cond	=1000;	(* nombre max de conditions par règle *)
	max_spy		=10;	(* nombre de sous programmes en spy *)
	max_loop	=10;	(* nombre de sous programmes en loop *)
	max_file	=5;	(* fichiers input *)
	max_fich	=10;	(* fichiers reset et rewrite *)
	max_mark	=10;	(* nombre de variables markables *)

	quest=1;
	fait=2;
	regle=3;

	minint=-32767;
	maxint=32767;

        l24=23;
        l23=22;

type

	tstring	= string[lstr];
	ttstring= string[ncmot];
	pttstring=^ttstring;

	noeu = record
		code	: integer;
		fils	: integer;
		frere	: integer;
		value	: real;		(* valeur du nombre si code = nombre *)
		niveau	: integer;
		depend	: integer;
		end;
	symble = record
		symbol	:pttstring;	(* nom du symbol *)
		suivant	:integer;	(* chainage sur le mot suivant *)
		nbr_arg	:integer;	(* nombre d'arguments *)
		premier	:integer;	(* premier fait ou regle *)
		dernier	:integer;	(* dernier fait ou regle *)
		vale	:integer;	(* objet associe au symbole *)
		modul	:integer;	(* nom du module *)
		phsh_coded : integer;	(* pointeur table de hsh coded *)
		end;

	cond	= array [1..max_cond] of integer; (* resultat de l'analyse *)
	ppcond = ^cond;
	el_cond	= array [1..m_cond] of integer; (* resultat de l'analyse *)
	ptcond = ^el_cond;
	fai	= record
		fait	: el_cond;	(* description du fait ou règle *)
		suivant	: integer;	(* fait ou règle suivant *)
		coded_next : integer;	(* hsh coded suivant *)
		regle	: integer;	(* 1 si regle, 0 si fait *)
		ral_cond: integer;	(* rallonge de l element *)
		end;
	t_hsh_coded = record
			tete_coded : array[0..max_coded] of integer;
			queue_coded: array[0..max_coded] of integer;
			end;
	pt_hsh_coded = ^t_hsh_coded;
	arb = record
		demo	: integer;
		numero	: integer;
		brother	: integer;
		snoeud	: integer;
		senv	: integer;
		info	: integer;
		end;

	tyopt	=record
		v:integer;
		s:ttstring;
		end;

	psymbole = array[-1..max_sym] of symble;
	pnoeud = array[1..max_noeud] of noeu;
	parbre = array[1..max_arbre] of arb;

	pfait = array[1..nfait_paq] of fai;
	ppfait = array[-1..2500] of ^fai;
	pppfait = array[-1..nfait_paq] of ^fai;
	penv = array[1..max_env] of integer;

	tdes = record
		l,c	: integer;
		ls,cs	: integer;
		v	: integer;
		tc,bc	: integer;
		num	: integer;
		numer	: integer;
		rz	: boolean;
		end;
	tdescr = record
		typ	: integer;
		min,max	: real;
		ppr	: boolean;
		menuf	: boolean;
		oblig	: boolean;
		antic	: boolean;
		listword: integer;
		des1	: tdes;
		des2	: tdes;
		end;

var
	lsave		: integer;
	voption		: char;		(* myprol /option *)
	max_fait	: integer;	(* nombre de faits et regles *)
	max_paq		: integer;	(* nombre de paquets de faits *)
	t_fait		: array[1..10] of ^pfait;

	cmd : tstring ;

	ok		: boolean;	(* phrase correcte *)
	finprol		: boolean;	(* fin du programme *)
	type_phrase	: integer;	(* type de la phrase *)

	table_symbole	: ^psymbole;
	nsym		: integer;	(* nombre de symboles definis *)
	npredef		: integer;	(* numero du dernier pr‚d‚fini *)

	noeud		: ^pnoeud;
	nnoeud		: integer;	(* nombre de noeuds utilises *)
	nbnoeud		: integer;

	libglob		: integer;
	nglob		: integer;
	nbglob		: integer;

	premier_sym	: array[0..max_par,0..max_hsh] of integer;
	dernier_sym	: array[0..max_par,0..max_hsh] of integer;
	nmodule		: integer;	(* nom du module courrant *)

	table_arbre	: ^parbre;
	narbre		: integer;
	nbarbre		: integer;

	table_env	: ^penv;
	nenv		: integer;
	nbenv		: integer;
	sortie		: boolean;

	nniveau		: integer;
	nnivquest	: integer;
	oldenv		: integer;

	phrase		: tstring;	(* phrase a analyser *)
	indphrase	: integer;	(* position dans la ligne *)
	car		: char;		(* caractere courant de la phrase *)
	arret		: char;		(* arreter une manip longue *)
	mot		: ttstring;	(* mot courant de la phrase *)
	symbole_lu	: ttstring;
	hsh		: integer;	(* valeur du hshcode du mot *)
	quote		: boolean;	(* ' en cours *)

	tconver		: cond; 	(* resultat de l'analyse *)
	conditions	: cond;		(* conditions de la phrase *)
	l_cd,l_cl,l_t	:integer;	(* taille de l analyse *)
	conclusion	: cond;		(* conclusion de la phrase *)
	table_fait	: ^ppfait;
	tt_fait		: ^pppfait;
	fait_libre	: integer;	(* premier fait libre *)
	last_libre	: integer;	(* dernier de la chaine des faits *)
	nfait		: integer;
	nnfait		: integer;	(* nombre de faits utilises *)
	table_coded	: array [1..max_hsh_coded] of pt_hsh_coded;
	nhsh_coded	: integer;	(* nombre de hsh coded *)
	cindex		: integer;	(* index dans resultat d'analyse *)
	repondu		: boolean;
	modcar		: boolean;
	nb	: record	(* stokage 1 reel dans 3 entiers *)
		case integer of
			0	:(rea	: real);

			1	:(int1	: integer;
				int2	: integer;
				int3	: integer);

			end;

	access_index	: integer;
	last_index	: integer;
	back_index	: boolean;

	reinput		:integer;
	compile,noquest	:boolean;
	user_name	:array[1..max_file] of ttstring;
	no_ligne	:array[1..max_file] of integer;
	user_file	:array[1..max_file] of text;

	fichier		:array[-1..max_fich] of text;
	efichier	:array[-1..max_fich] of integer;
	cfichier	:array[-1..max_fich] of integer;
	pfichier	:array[-1..max_fich] of tstring;
	ifichier	:array[-1..max_fich] of integer;

	ttyout		:integer;
	ttyin		:integer;
	user		:integer;
	save_user	:integer;
	stt		:integer;

	echo		:boolean;
	auto		:boolean;
	read_bavard	:boolean;
	indput		:boolean;
	indword		:boolean;
	glob		:boolean;
	rnd_seed	:integer;
	option		:integer;

	nspy		:integer;
	table_spy	:array[1..max_spy] of integer;
	nloop		:integer;
	table_loop	:array[1..max_loop] of integer;
	trace		:boolean;

	save_txt	:integer;	(* sauvegarde sous forme texte *)
	indfait		:boolean;	(* que des question si false *)

	envcour		:array[1..50] of integer;
	envquest	:array[1..50] of integer;

	nmark		:integer;
	mark		:array[1..max_mark] of integer;
	nommark		:array[1..max_mark] of integer;
	arbre_mark	:array[1..max_mark] of integer;
	com		:boolean;
	last_com	:integer;
	tabl_com	:array[1..max_com] of tstring;
	noaccent	: boolean;
	nocolor		: boolean;
	ioresu		: integer;
	prompt		: ttstring;
	nb_erreur	: integer;
	backtrack	: boolean;
	fils1,fils2	: integer;
	fait1,fait2	: integer;
	snum		: integer;
	fils1_code	: integer;
	indarb		: integer;
	nomblock	: integer;
	imbric		: integer;
	objet		: integer;
	pcond		: ptcond;
	ralo		: integer;
	nummenu		: integer;

  procedure mainprol;

implementation
uses uini,uana,udemo;
  procedure essai ;
  var ph:tstring;
 car:char;
 begin
 car:='a';
 ph[1]:=ansichar(car);
 ph[0]:=ansichar(chr(1));
 car:=char(ph[1]);
 writeln(ph,car);
 read(car);readln;
 halt;
 end;

procedure mainprol;
begin
 writeln('      Interpreteur Prolog - Version 5.0');
 iniprol;
 finprol := false;
 while (not finprol) do
    begin
    analyse_phrase;
    if ok
    then	trait_phrase;
    end;
            (* final;       *)

end;

end.
