eDBASE PRO(EXPERT PRO,).HANOI PROULISP PROX MATH PROeNL PROk(NL1 PRO uNL2 PRO NL3 PRO i<NL4 PRO BPLANNER PROPROLOG CMD)1PROLOG LIB% The functions in this file are the start of a natural language % front end for DBASEII. % It will allow "English" sentences for the DISPLAY command. % Sections Copyright 1984 by MICRO-AI. All rights reserved. % To run, type "parse!" % Then enter your command, ending it with a period. % When you have entered enough sentences, enter "stop." % and you will return to Prolog86. % The sentences must be of the form: % Show me all of the records without record numbers where the % ZipCode is equal to 1000. % Note, there are several variations on this command. % See the code for other sentences which the program will accept. % A translator for the grammar rules. From C & M op(1200,xfx,-->)! op(700,xfy,&)! trans :- read_from_this_file,repeat,grammar,eof,!,fail. grammar :- read(X), (X = stop -> abort | true), translate(X,Y),!, assert(Y). grammar :- eof,!. grammar :- print("SYNTAX ERROR IN TRANSLATION"),skip(.). translate((PO --> QO),(P :- Q)) :- !, left_hand_side(PO,SO,S,P), right_hand_side(QO,SO,S,Q1), flatten(Q1,Q). translate(end_of_file,end_of_file) :- !,fail. translate(X,(X)). left_hand_side((NT , Ts),SO,S,B) :- nonvar(NT), islist(Ts), tag(NT,SO,S1,P), append(Ts,SO,S1). left_hand_side(NT,SO,S,P) :- nonvar(NT), tag(NT,SO,S,P). right_hand_side((X1 , X2),SO,S,P) :- !, right_hand_side(X1,SO,S1,P1), right_hand_side(X2,S1,S,P2), and(P1,P2,P). right_hand_side((X1 | X2),SO,S,(P1 | P2)) :- !, or(X1,SO,S,P1), or(X2,SO,S,P2). right_hand_side({P}, S,S,P) :- !. right_hand_side(!,S,S,!) :- !. right_hand_side(Ts,SO,S,true) :- islist(Ts),!, append(Ts,S,SO). right_hand_side(X,SO,S,P) :- tag(X,SO,S,P). or(X,SO,S,P) :- right_hand_side(X,SOa,S,Pa), (var(SOa),SOa = S,!,SO = SOa, P = Pa | P = (SO = SOa, Pa)). tag(X,SO,S,P) :- X =.. [F, ..A], append(A,[SO,S],AX), P =.. [F, ..AX]. and(true,P,P) :- !. and(P,true,P) :- !. and(P,Q,(P,Q)). islist([]) :- !. islist([_, .._]). append([A|B],C,[A|D]) :- append(B,C,D). append([],X,X). flatten((P1|P2),(Q1|Q2)) :- flatten(P1,Q1), flatten(P2,Q2). flatten(((P1,P2),P3),Q) :- flatten((P1,(P2,P3)),Q). flatten((P1,P2),(Q1,Q2)) :- !, flatten(P1,Q1), flatten(P2,Q2). flatten(A,A) :- !. % The parser parse :- inlist(T,L), parse1(T,L),!. parse1(_,L) :- (L = [stop]), nl, print("BYE!"), nl,!. parse1(statement,L) :- sentence(Y, L, []),!, form_command(Y,Z),nl, print(Z), nl,print("PARSED"),nl,!, parse. parse1(_,L) :- nl, print("I DO NOT UNDERSTAND!"), nl,!, parse. inlist(T,X) :- ratom(Y),next(T,Y,X). next(T,.,[]) :- T = statement, !. next(T,X,[X|Y]) :- inlist(T,Y). unlist([]) :- print(.),nl,!. unlist([H|T]) :- prin(' '),prin(H),!,unlist(T). form_command(Y,Y). % The grammar rules. trans! sentence(stop,[stop],[]). sentence([P1|P2]) --> commands(P1),rest_sentence(P2). commands(P1) --> command_word(P1),[me]. commands(P1) --> command_word(P1). rest_sentence(P) --> scope(P). rest_sentence(P) --> scope(P1),line_number(P2),{append(P1,P2,P)}. rest_sentence(P) --> scope(P1),line_number(P2),{append(P1,P2,X)}, conditions(P3),{append(X,P3,P)}. scope(['All']) --> [all,of,the],record_word(_). scope(['All']) --> [all],record_word(_). scope([P1,P2]) --> record_word(P1),record_number(P2). scope([P1,P2]) --> [the],next_word(P1),record_number(P2),record_word(_). scope([P1,1]) --> [the],next_word(P1),record_word(_). scope([],Y,Y). record_number(W) --> [W],{integer(W)}. line_number(['OFF']) --> [without,record,numbers]. line_number([]) --> [with,record,numbers]. line_number([],Y,Y). conditions(P) --> [for,which,the],conds(P). conditions(P) --> [where,the],conds(P). conditions([],Y,Y). conds(P) --> word(W1),condition(W1,P). word(X) --> [X]. condition(W1,P) --> [is,equal,to],word(W2),{P = [W1 = W2]}. % The dictionary command_word('DISPLAY') --> ['Show']. command_word('DISPLAY') --> ['List']. command_word('DISPLAY') --> ['Display']. record_word('Record') --> [records]. record_word('Record') --> [record]. record_word('Record') --> [items]. record_word('Record') --> [item]. next_word('Next') --> [next]. G])). how(X(A,B)) :- X(A,B,_,[H|T]),!, print(H), !, how1(T),!. how1([]) :- print("END OF EXPLAINATION."), !. how1([H|T]) :- print(H), how1(T),!. diagnose :- print('This program will help you diagnose which of the 's on baseline&0Superscript characters raised above baseline00Subscript character lowered below baseline0Hfont name: font name attribute. The possible responses are determined byH?the printer named with the Print Options command. You can get a?Klist of printers by pressing a direction key or the right mouse button. A KKstandard font name can also be entered, but how the document actually will KClook depends on the printer's capabilities. The standard fonts are:C$Roman a - Roman p ask_about(has(X,Y,W,Z),T) :- print('Does the ',X,' have ',Y,'?'), !,nl, ratom(A), respond(A,has(X,Y,W,Z),T),!. ask_about(gives(X,Y,W,Z),T) :- print('Does the ',X,' give ',Y,'?'), !,nl, ratom(A), respond(A,gives(X,Y,W,Z),T),!. ask_about(eats(X,Y,W,Z),T) :- print('Does the ',X,' eat ',Y,'?'), !,nl, ratom(A), respond(A,eats(X,Y,W,Z),T),!. ask_about(flies(X,Y,W,Z),T) :- print('Does the ',X,' fly ',Y,'?'), !,nl, ratom(A), respond(A,flies(X,Y,W,Z),T),!. ask_about(swims(X,_,W,Z),T) :- print('Does the ',X,' swim?'), !,nl, ratom(A), respond(A,swims(X,' ',W,Z),T),!. ask_about(size(X,Y,W,Z),T) :- print('Is the ',X,' ',Y,'?'), !,nl, ratom(A), respond(A,size(X,Y,W,Z),T),!. ask_about(breathing(X,Y,W,Z),T) :- print('Does the ',X,' breathe ',Y,'?'), !,nl, ratom(A), respond(A,breathing(X,Y,W,Z),T),!. ask_about(vertebrate(X,_,W,Z),T) :- print('Is the ',X,' a vertebrate?'), !,nl, ratom(A), respond(A,vertebrate(X,' ',W,Z),T),!. respond(yes,X(A,B,[H|L],[D]),T) :- concat([' FACT: ',A,' ',X,' ',B],D), asserta(X(A,B,_,[D])). respond(why,X,[]) :- print("You should know!"), nl, ask_about(X,[]). respond(why,X,[H|T]) :- print(H), nl,!, ask_about(X,T). has(A,B,L,M) :- ask_about(has(A,B,L,M),L),!. gives(A,B,L,M) :- ask_about(gives(A,B,L,M),L),!. eats(A,B,L,M) :- ask_about(eats(A,B,L,M),L),!. flies(A,B,L,M) :- ask_about(flies(A,B,L,M),L),!. swims(A,_,L,M) :- ask_about(swims(A,_,L,M),L),!. size(A,B,L,M) :- ask_about(size(A,B,L,M),L),!. breathing(A,B,L,M) :- ask_about(breathing(A,B,L,M),L),!. vertebrate(A,B,L,M) :- ask_about(vertebrate(A,B,L,M),L),!. isa(A,mammal,M,L) :- concat(['RULE 1: ',A,' is a mammal if it has hair.'],Z), append(M,[Z],X), has(A,hair,X,W),!, append([Z],W,L), asserta(isa(A,mammal,M,L)). isa(A,mammal,M,L) :- concat(['RULE 2: ',A,' is a mammal if it gives milk.'],Z), append(M,[Z],X), gives(A,milk,X,W),!, append([Z],W,L), asserta(isa(A,mammal,M,L)). isa(A,bird,M,L) :- concat(['RULE 3: ',A,' is a bird if it has feathers.'],Z), append(M,[Z],X), has(A,feathers,X,W),!, append([Z],W,L), asserta(isa(A,bird,M,L)). isa(A,bird,M,L) :- concat(['RULE 4: ',A,' is a bird if it flies.'],Z), append(M,[Z],X), flies(A,well,X,W),!, append([Z],W,L), asserta(isa(A,bird,M,L)). isa(A,carnivore,M,L) :- concat(['RULE 5: ',A,' is a carnivore if it eats meat.'],Z), append(M,[Z],X), eats(A,meat,X,W),!, append([Z],W,L), asserta(isa(A,carnivore,M,L)). isa(A,reptile,M,L) :- concat(['RULE 6: ',A,' is a reptile if is an air-breathing vertebrate.'],Z), append(M,[Z],X), breathing(A,air,X,W), vertebrate(A,_,X,N), append([Z],W,R), append(R,N,L), asserta(isa(A,reptile,M,L)). isa(A,tiger) :- concat(['RULE 7: ',A,' is a tiger if it is a mammal,','\n','and a carnivore, and has black stripes.'],Z), isa(A,mammal,[Z],M), isa(A,carnivore,[Z],N), has(A,'black stripes',[Z],E), print(A,' is a tiger.'),nl,!, append(M,N,W), append(W,E,G), asserta(isa(A,tiger,[Z],[Z|G])). isa(A,ostrich) :- concat(['RULE 8: ',A,' is an ostrich if it is a bird,','\n','has a long neck and long legs.'],Z), isa(A,bird,[Z],M), has(A,'a long neck',[Z],C), has(A,'long legs',[Z],E), print(A,' is an ostrich.'),nl,!, append(M,C,F), append(F,E,G), asserta(isa(A,ostrich,[Z],[Z|G])). isa(A,whale) :- concat(['RULE 9: ',A,' is a whale if it is a mammal,','\n','has a gray color, swims and is huge.'],Z), isa(A,mammal,[Z],M), has(A,'a gray color',[Z],N), swims(A,_,[Z],C), size(A,huge,[Z],D), print(A,' is a whale.'),nl,!, append(M,N,W), append(C,D,F), append(W,F,G), asserta(isa(A,whale,[Z],[Z|G])). isa(A,robin) :- concat(['RULE 10: ',A,' is a robin if it is a bird and has a red breast.'],Z), isa(A,bird,[Z],M), has(A,'a red breast',[Z],N), print(A,' is a robin.'),nl,!, append(M,N,G), asserta(isa(A,robin,[Z],[Z|G])). isa(A,rattlesnake) :- concat(['RULE 11: ',A,' is a rattlesnake if it is a reptile and has rattles.'],Z), isa(A,reptile,[Z],M), has(A,'rattles',[Z],N), print(A,' is a rattlesnake.'),nl,!, append(M,N,G), asserta(isa(A,rattlesnake,[Z],[Z|G])). how(X(A,B)) :- X(A,B,_,[H|T]),!, print(H), !, how1(T),!. how1([]) :- print("END OF EXPLAINATION."), !. how1([H|T]) :- print(H), how1(T),!. diagnose :- print('This program will help you diagnose which of the '), print('following animals you are thinking of:'),nl, print('tiger, ostrich, robin, whale, or rattlesnake'),nl,nl, possibilities(X),!, diagnose1(X),!. diagnose1([]) :- print("No hypothesis can be confirmed."),!. diagnose1([H|T]) :- isa(animal,H),!, nl, ask('Do you want to know how I reached this conclusion?',A),!, A = yes, nl, how(isa(animal,H)),!. diagnose1([H|T]) :-!, diagnose1(T). possibilities([robin, rattlesnake, ostrich, whale, tiger]). append([],L,L). append([Z|L1],L2,[Z|L3]) :- append(L1,L2,L3).  % The Tower of Hanoi Game hanoi(N) :- move(N,left,center,right). move(0,_,_,_) :- !. move(N,A,B,C) :- M is N - 1, move(M,A,C,B), inform(A,B), move(M,C,B,A). inform(X,Y) :- print("Move the disk on ",X," to ",Y), nl.  %Functions which manipulate lists and sets. %Some correspond to functions in LISP. car([X|T],X). cdr([_|Y],Y). last([X],X) :- !. last([_|Y],X) :- last(Y,X). nextto(X,Y,[X,Y|_]) :- !. nextto(X,Y,[_|Z]) :- nextto(X,Y,Z). cons(A1,[],[A1]). cons(A1,[H|T],[A1,H|T]). append([],L,L). append([X|L1],L2,[X|L3]) :- append(L1,L2,L3). list(A,[A]) :- !. reverse([],[]). reverse([H|T],L) :- reverse(T,Z),append(Z,[H],L). efface(_,[],[]). efface(A,[A|L],L) :- !. efface(A,[B|L],[B|M]) :- efface(A,L,M). delete(_,[],[]). delete(X,[X|L],M) :- !, delete(X,L,M). delete(X,[Y|L1],[Y|L2]) :- delete(X,L1,L2). subst(_,[],_,[]). subst(X,[X|L],A,[A|M]) :- !,subst(X,L,A,M). subst(X,[Y|L],A,[Y|M]) :- subst(X,L,A,M). sublist([X|L],[X|M]) :- prefix(L,M),!. sublist(L,[_|M]) :- sublist(L,M). prefix([],_). prefix([X|L],[X|M]) :- prefix(L,M). mapcar(_,[],[]) :- !. mapcar(F,[H|T],[Y|M]) :- F(H,Y), !, mapcar(F,T,M). add1(N,M) :- M is N + 1, !. member(X,[X|_]). member(X,[_|Y]) :- member(X,Y). subset([A|X],Y) :- member(A,Y),subset(X,Y). subset([],Y). disjoint(X,Y) :- not((member(Z,X),member(Z,Y))). intersection([],X,[]). intersection([X|R],Y,[X|Z]) :- member(X,Y), !, intersection(R,Y,Z). intersection([X|R],Y,Z) :- intersection(R,Y,Z). union([],X,X). union([X|R],Y,Z) :- member(X,Y), !, union(R,Y,Z). union([X|R],Y,[X|Z]) :- union(R,Y,Z).  %PROLOG86 clauses which perform symbolic differentiation. d(- U,X,- DU) :- !, d(U,X,DU). d(U + V,X,DU + DV) :- !, d(U,X,DU), d(V,X,DV). d(U - V,X,DU - DV) :- !, d(U,X,DU), d(V,X,DV). d(U * V,X,U * DV + V * DU) :- !, d(U,X,DU), d(V,X,DV). d(U / V,X,(V * DU - U * DV) / V ^ 2) :- !, d(U,X,DU), d(V,X,DV). d(U ^ N,X,N * (U ^ N1) * DU) :- integer(N), !, N1 is N - 1, d(U, X, DU). d(e ^ U, X,(e ^ U) * DU) :- !, d(U, X, DU). d(sin(U), X, DU * cos(U)) :- !, d(U,X,DU). d(cos(U),X, - DU * sin(U)) :- !, d(U, X, DU). d(ln(U), X, DU / U) :- !, d(U,X,DU). d(X,X,1) :- !. d(C,X,0) :- !. % The functions in this file are the start of a natural language program. % Sections Copyright 1984, MICRO-AI. All rights reserved. % This program allows the user to assert certain facts into the data % base and then ask questions about them. % To start, enter "parse!" % For example, you can state that: % "Hammer1 is a hammer." % "Hammer2 is a hammer." % "A hammer is a tool." % You can then state the commands: % "Find all hammers!" % "Find all tools!" % Or ask the question: % "Is Hammer1 a hammer?" % A translator for the grammer rules. From C & M op(1200,xfx,-->)! op(700,xfy,&)! trans :- read_from_this_file,repeat,grammar,eof,!,fail. grammar :- read(X), (X = stop -> abort | true), translate(X,Y),!, assert(Y). grammar :- eof,!. grammar :- print("SYNTAX ERROR IN TRANSLATION"),skip(.). translate((PO --> QO),(P :- Q)) :- !, left_hand_side(PO,SO,S,P), right_hand_side(QO,SO,S,Q1), flatten(Q1,Q). translate(end_of_file,end_of_file) :- !,fail. translate(X,(X)). left_hand_side((NT , Ts),SO,S,B) :- nonvar(NT), islist(Ts), tag(NT,SO,S1,P), append(Ts,SO,S1). left_hand_side(NT,SO,S,P) :- nonvar(NT), tag(NT,SO,S,P). right_hand_side((X1 , X2),SO,S,P) :- !, right_hand_side(X1,SO,S1,P1), right_hand_side(X2,S1,S,P2), and(P1,P2,P). right_hand_side((X1 | X2),SO,S,(P1 | P2)) :- !, or(X1,SO,S,P1), or(X2,SO,S,P2). right_hand_side({P}, S,S,P) :- !. right_hand_side(!,S,S,!) :- !. right_hand_side(Ts,SO,S,true) :- islist(Ts),!, append(Ts,S,SO). right_hand_side(X,SO,S,P) :- tag(X,SO,S,P). or(X,SO,S,P) :- right_hand_side(X,SOa,S,Pa), (var(SOa),SOa = S,!,SO = SOa, P = Pa | P = (SO = SOa, Pa)). tag(X,SO,S,P) :- X =.. [F, ..A], append(A,[SO,S],AX), P =.. [F, ..AX]. and(true,P,P) :- !. and(P,true,P) :- !. and(P,Q,(P,Q)). islist([]) :- !. islist([_, .._]). append([A|B],C,[A|D]) :- append(B,C,D). append([],X,X). flatten((P1|P2),(Q1|Q2)) :- flatten(P1,Q1), flatten(P2,Q2). flatten(((P1,P2),P3),Q) :- flatten((P1,(P2,P3)),Q). flatten((P1,P2),(Q1,Q2)) :- !, flatten(P1,Q1), flatten(P2,Q2). flatten(A,A) :- !. % The parser parse :- inlist(T,L), parse1(T,L),!. parse1(_,L) :- (L = [stop]), nl, print('BYE!'), nl,!. parse1(statement,L) :- sentence(Y, L, []),!, assert_list(Y), nl,print('PARSED'),nl,!, parse. parse1(question,L) :- sentence(Y,L,[]), ask_list(Y),!, sentence(Y,W,[]),!,nl, prin('Yes. '), unlist(W),!, parse. parse1(question,_) :- nl, print('I CAN FIND NO ANSWER.'),nl,!, parse. parse1(command,['Find',all,L]) :- sentence(Y,['Find',all,L],[]),!, form_command(Y,findall1(A,B,C)), findall1(A,B,C),!, print_result(L,C), parse. parse1(_,L) :- nl, print('I DO NOT UNDERSTAND!'), nl,!, parse. print_result(L,[]) :- nl, prin('I could find no '), prin(L),print('.'),nl,!. print_result(L,C) :- length(C,X), X > 1, nl,prin('The '),prin(L),prin(' are '), prin_list(C),print('.'),nl,!. print_result(L,[C]) :- length([C],X), X = 1, single_word(L,S), nl,prin('The only '),prin(S),prin(' is '), prin(C),print('.'),nl,!. prin_list([H,T]) :- prin(H),prin(' and '),prin(T),!. prin_list([H|T]) :- prin(H),prin(', '),prin_list(T). assert_list([]) :- !. assert_list([H|T]) :- asserta(H),!, assert_list(T). ask_list([]) :- !. ask_list([H|T]) :- H,!, ask_list(T). inlist(T,X) :- ratom(Y),next(T,Y,X). next(T,.,[]) :- T = statement, !. next(T,?,[]) :- T = question, !. next(T,'!',[]) :- T = command, !. next(T,X,[X|Y]) :- inlist(T,Y). unlist([]) :- print(.),nl,!. unlist([H|T]) :- prin(' '),prin(H),!,unlist(T). form_command(Y,Y). % The grammer rules. trans! sentence(stop,[stop],[]). sentence(P) --> proper_noun(X),[is],noun_phrase(X,P). sentence(P) --> det(P1,P2,P),noun(X,P1),[is],noun_phrase(X,P2). sentence(P) --> ['Is'],proper_noun(X),noun_phrase(X,P). sentence(P) --> find_all(X,P1,P),noun(X,P1). find_all(X,P1,findall1(X,P1,L)) --> ['Find',all]. det(P1,[P2],[(P2 :- P1)]) --> [A]. noun_phrase(X,[P]) --> noun(X,P). noun_phrase(X,[P]) --> det(X),noun(X,P). % The dictionary det(X) --> [a]. noun(X,hammer(X)) --> [hammer]. noun(X,hammer(X)) --> [hammers]. noun(X,tool(X)) --> [tool]. noun(X,tool(X)) --> [tools]. proper_noun('Hammer1') --> ['Hammer1']. proper_noun('Hammer2') --> ['Hammer2']. % new definition of findall findall1(X,G,_) :- asserta(found(mark)), G, asserta(found(X)), fail. findall1(_,_,L) :- collect_found([],M), !, L = M. collect_found(S,L) :- getnext(X), !, collect_found([X|S],L). collect_found(L,L). getnext(X) :- retract(found(X)), !, X /= mark. % change a plural ending in s to single single_word(P,S) :- name(P,Y), last(Y,W), W = s, remove_s(Y,Z), name(S,Z),!. last([X],X) :- !. last([_|Y],X) :- last(Y,X). remove_s([X],[]) :- !. remove_s([H|T],[H|W]) :- remove_s(T,W). % The functions in this file are the start of a natural language program. % Sections Copyright 1984, MICRO-AI. All rights reserved. % This natural language program parses simple sentences. % It knows "number" (i.e., whether a noun should be singular or plural) % I parses sentences such as: % Mary likes all men. Mary likes a man. Mary likes every man. % every man that lives likes Mary. % It rejects sentences like: Mary likes a men. % A translator for the grammer rules. From C & M op(1200,xfx,-->)! op(700,xfy,&)! trans :- read_from_this_file,repeat,grammar,eof,!,fail. grammar :- read(X), (X = stop -> abort | true), translate(X,Y),!, assert(Y). grammar :- eof,!. grammar :- print("SYNTAX ERROR IN TRANSLATION"),skip(.). translate((PO --> QO),(P :- Q)) :- !, left_hand_side(PO,SO,S,P), right_hand_side(QO,SO,S,Q1), flatten(Q1,Q). translate(end_of_file,end_of_file) :- !,fail. translate(X,(X)). left_hand_side((NT , Ts),SO,S,B) :- nonvar(NT), islist(Ts), tag(NT,SO,S1,P), append(Ts,SO,S1). left_hand_side(NT,SO,S,P) :- nonvar(NT), tag(NT,SO,S,P). right_hand_side((X1 , X2),SO,S,P) :- !, right_hand_side(X1,SO,S1,P1), right_hand_side(X2,S1,S,P2), and(P1,P2,P). right_hand_side((X1 | X2),SO,S,(P1 | P2)) :- !, or(X1,SO,S,P1), or(X2,SO,S,P2). right_hand_side({P}, S,S,P) :- !. right_hand_side(!,S,S,!) :- !. right_hand_side(Ts,SO,S,true) :- islist(Ts),!, append(Ts,S,SO). right_hand_side(X,SO,S,P) :- tag(X,SO,S,P). or(X,SO,S,P) :- right_hand_side(X,SOa,S,Pa), (var(SOa),SOa = S,!,SO = SOa, P = Pa | P = (SO = SOa, Pa)). tag(X,SO,S,P) :- X =.. [F, ..A], append(A,[SO,S],AX), P =.. [F, ..AX]. and(true,P,P) :- !. and(P,true,P) :- !. and(P,Q,(P,Q)). islist([]) :- !. islist([_, .._]). append([A|B],C,[A|D]) :- append(B,C,D). append([],X,X). flatten((P1|P2),(Q1|Q2)) :- flatten(P1,Q1), flatten(P2,Q2). flatten(((P1,P2),P3),Q) :- flatten((P1,(P2,P3)),Q). flatten((P1,P2),(Q1,Q2)) :- !, flatten(P1,Q1), flatten(P2,Q2). flatten(A,A) :- !. inlist(X) :- ratom(Y),next(Y,X). next(.,[]) :- !. next(?,[]) :- !. next(!,[]) :- !. next(X,[X|Y]) :- inlist(Y). % the parser parse :- inlist(L), parse2(L),!. parse2(L) :- (L = [stop]), nl, print('BYE!'), nl,!. parse2(L) :- (sentence(Z,L,[]) | (Z = 'I DO NOT UNDERSTAND!')), nl, print(Z), nl,!, parse. % the grammar rules trans! sentence(sentence(NP,VP)) --> np(X,NP),vp(X,VP). np(s,np(N)) --> proper_noun(N). np(N,np(Det,Noun,Rel)) --> det(N,Det),noun(N,Noun),rel_clause(N,Rel). vp(N,vp(IV)) --> intrans_verb(N,IV). vp(N,vp(TV,NP)) --> trans_verb(N,TV),np(N1,NP). rel_clause(N,rel(that,VP)) --> [that],vp(N,VP). rel_clause(N,rel(nil)) --> []. det(N,det(W)) --> [W],{is_determiner(W,N)}. det(p,det(nil)) --> []. noun(N,n(Root)) --> [W],{is_noun(W,N,Root)}. proper_noun(proper_noun(W)) --> [W],{is_name(W)}. trans_verb(N,tv(Root)) --> [W],{is_trans(W,N,Root)}. intrans_verb(N,iv(Root)) --> [W],{is_intrans(W,N,Root)}. % the dictionary is_determiner(every,s). is_determiner(all,p). is_noun(man,s,man). is_noun(men,p,man). is_name('Mary'). is_trans(likes,s,like). is_trans(like,p,like). is_intrans(lives,s,live). is_intrans(live,p,live). is_determiner(the,_). is_determiner(a,s). number(P2),record_word(_). scope([P1,1]) --> [the],next_word(P1),record_word(_). scope([],Y,Y). record_number(W) --> [W],{it once.$FORMAT FOOTNOTEIInserts or replaces a footnote reference mark in front of the selection, IDthen jumps to the end of the document so you can insert or edit the DFcorresponding footnote text. When you finish editing the footnote, theFHJump Footnote command returns to the footnote reference mark. Note that HDwhen you delete, copy, or move a footnote, the footnote text will beD(automatically deleted, copied, or moved.(Mreference mark: determines the characters that become the footnote r% The functions in this file are the start of a natural language program. % Sections Copyright 1984, MICRO-AI. All rights reserved. % This program translates simple natural language into predicate calculus % It prases sentences such as: % every man that lives loves a woman. % John loves a woman. % every man loves a woman. % a man loves a woman. % Mary loves John. % A translator for the grammer rules. From C & M op(1200,xfx,-->)! op(700,xfy,&)! trans :- read_from_this_file,repeat,grammar,eof,!,fail. grammar :- read(X), (X = stop -> abort | true), translate(X,Y),!, assert(Y). grammar :- eof,!. grammar :- print("SYNTAX ERROR IN TRANSLATION"),skip(.). translate((PO --> QO),(P :- Q)) :- !, left_hand_side(PO,SO,S,P), right_hand_side(QO,SO,S,Q1), flatten(Q1,Q). translate(end_of_file,end_of_file) :- !,fail. translate(X,(X)). left_hand_side((NT , Ts),SO,S,B) :- nonvar(NT), islist(Ts), tag(NT,SO,S1,P), append(Ts,SO,S1). left_hand_side(NT,SO,S,P) :- nonvar(NT), tag(NT,SO,S,P). right_hand_side((X1 , X2),SO,S,P) :- !, right_hand_side(X1,SO,S1,P1), right_hand_side(X2,S1,S,P2), and(P1,P2,P). right_hand_side((X1 | X2),SO,S,(P1 | P2)) :- !, or(X1,SO,S,P1), or(X2,SO,S,P2). right_hand_side({P}, S,S,P) :- !. right_hand_side(!,S,S,!) :- !. right_hand_side(Ts,SO,S,true) :- islist(Ts),!, append(Ts,S,SO). right_hand_side(X,SO,S,P) :- tag(X,SO,S,P). or(X,SO,S,P) :- right_hand_side(X,SOa,S,Pa), (var(SOa),SOa = S,!,SO = SOa, P = Pa | P = (SO = SOa, Pa)). tag(X,SO,S,P) :- X =.. [F, ..A], append(A,[SO,S],AX), P =.. [F, ..AX]. and(true,P,P) :- !. and(P,true,P) :- !. and(P,Q,(P,Q)). islist([]) :- !. islist([_, .._]). append([A|B],C,[A|D]) :- append(B,C,D). append([],X,X). flatten((P1|P2),(Q1|Q2)) :- flatten(P1,Q1), flatten(P2,Q2). flatten(((P1,P2),P3),Q) :- flatten((P1,(P2,P3)),Q). flatten((P1,P2),(Q1,Q2)) :- !, flatten(P1,Q1), flatten(P2,Q2). flatten(A,A) :- !. % the parser parse :- inlist(L), parse1(L),!. parse1(L) :- (L = [stop]), nl, print('BYE!'), nl,!. parse1(L) :- (sentence(Y, L, []) | Y = 'I DO NOT UNDERSTAND! '), nl, print(Y), nl,!, parse. inlist(X) :- ratom(Y),next(Y,X). next(.,[]) :- !. next(?,[]) :- !. next(!,[]) :- !. next(X,[X|Y]) :- inlist(Y). % the grammer rules trans! sentence(P) --> noun_phrase(X,P1,P), verb_phrase(X,P1). sentence(stop,[stop],[]). noun_phrase(X,P1,P) --> determiner(X,P2,P1,P), noun(X,P3), rel_clause(X,P3,P2). noun_phrase(X,P,P) --> proper_noun(X). verb_phrase(X,P) --> trans_verb(X,Y,P1), noun_phrase(Y,P1,P). verb_phrase(X,P) --> intrans_verb(X,P). rel_clause(X,P1,(P1 & P2)) --> [that], verb_phrase(X,P2). rel_clause(_,P,P) --> []. % the dictionary determiner(X,P1,P2,all(X,(P1 -> P2))) --> [every]. determiner(X,P1,P2,exists(X,(P1 & P2))) --> [a]. noun(X,man(X)) --> [man]. noun(X,woman(X)) --> [woman]. trans_verb(X,Y,loves(X,Y)) --> [loves]. intrans_verb(X,lives(X)) --> [lives]. proper_noun('John') --> ['John']. proper_noun('Mary') --> ['Mary']. |G])). isa(A,ostrich) :- concat(['RULE 8: ',A,' is an ostrich if it is a bird,','\n','has a long neck and long legs.'],Z), isa(A,bird,[Z],M), has(A,'a long neck',[Z],C), has(A,'long legs',[Z],E), print(A,' is an ostrich.'),nl,!, append(M,C,F), append(F,E,G), asserta(isa(A,ostrich,[Z],[Z|G])). isa(A,whale) :- concat(['RULE 9: ',A,' is a whale itime, move the pointer to the commandD6area. Press and release both buttons at the same time.6To choose with the keyboard:----------------------------G1. Press the CANCEL key (Esc) to activate the menu. You cannot choose G1commands with the keyboard while in type-in mode.1J2. Type the first letter of the desired command; or use the spacebar, or J)! op(700,xfy,&)! trans :- read_from_this_file,repeat,grammar,eof,!,fail. grammar :- read(X), (X = stop -> abort | true), translate(X,Y),!, assert(Y). grammar :- eof,!. grammar :- print("SYNTAX ERROR IN TRANSLATION"),skip(.). translate((PO --> QO),(P :- Q)) :- !, left_hand_side(PO,SO,S,P), right_hand_side(QO,SO,S,Q1), flatten(Q1,Q). translate(end_of_file,end_of_file) :- !,fail. translate(X,(X)). left_hand_side((NT , Ts),SO,S,B) :- nonvar(NT), islist(Ts), tag(NT,SO,S1,P), append(Ts,SO,S1). left_hand_side(NT,SO,S,P) :- nonvar(NT), tag(NT,SO,S,P). right_hand_side((X1 , X2),SO,S,P) :- !, right_hand_side(X1,SO,S1,P1), right_hand_side(X2,S1,S,P2), and(P1,P2,P). right_hand_side((X1 | X2),SO,S,(P1 | P2)) :- !, or(X1,SO,S,P1), or(X2,SO,S,P2). right_hand_side({P}, S,S,P) :- !. right_hand_side(!,S,S,!) :- !. right_hand_side(Ts,SO,S,true) :- islist(Ts),!, append(Ts,S,SO). right_hand_side(X,SO,S,P) :- tag(X,SO,S,P). or(X,SO,S,P) :- right_hand_side(X,SOa,S,Pa), (var(SOa),SOa = S,!,SO = SOa, P = Pa | P = (SO = SOa, Pa)). tag(X,SO,S,P) :- X =.. [F, ..A], append(A,[SO,S],AX), P =.. [F, ..AX]. and(true,P,P) :- !. and(P,true,P) :- !. and(P,Q,(P,Q)). islist([]) :- !. islist([_, .._]). append([A|B],C,[A|D]) :- append(B,C,D). append([],X,X). flatten((P1|P2),(Q1|Q2)) :- flatten(P1,Q1), flatten(P2,Q2). flatten(((P1,P2),P3),Q) :- flatten((P1,(P2,P3)),Q). flatten((P1,P2),(Q1,Q2)) :- !, flatten(P1,Q1), flatten(P2,Q2). flatten(A,A) :- !. % The parser parse :- inlist(T,L), parse1(T,L),!. parse1(_,L) :- (L = [stop]), nl, print('BYE!'), nl,!. parse1(statement,L) :- sentence(Y, L, []),!, form_statement(Y,Z), assert_list(Z), nl,print('PARSED'),nl,!, parse. parse1(question,L) :- sentence(Y,L,[]), form_question(Y,Z), ask_list(Z),!, sentence(Z,W,[]),!,nl, prin('Yes. '), unlist(W),!, parse. parse1(question,_) :- nl, print('I CAN FIND NO ANSWER.'),nl,!, parse. parse1(_,L) :- nl, print('I DO NOT UNDERSTAND!'), nl,!, parse. assert_list([]) :- !. assert_list([H|T]) :- asserta(H),!, assert_list(T). ask_list([]) :- !. ask_list([H|T]) :- H,!, ask_list(T). inlist(T,X) :- ratom(Y),next(T,Y,X). next(T,.,[]) :- T = statement, !. next(T,?,[]) :- T = question, !. next(T,'!',[]) :- T = command, !. next(T,X,[X|Y]) :- inlist(T,Y). unlist([]) :- print(.),nl,!. unlist([H|T]) :- prin(' '),prin(H),!,unlist(T). form_statement(Y,Y). form_question(Y,Y). % The grammer rules. trans! sentence(stop,[stop],[]). sentence(P) --> proper_noun(X),[is,a],noun_phrase(X,P). sentence(P) --> det(P1,P2,P),noun(X,P1),[is,a],noun(X,P2). sentence(P) --> ['Is'],proper_noun(X),[a],noun_phrase(X,P). sentence(P) --> ['Is'],proper_noun(X),adjs(X,P). noun_phrase(X,[P]) --> noun(X,P). noun_phrase(X,[P1|P2]) --> adjs(X,P2),noun(X,P1). adjs(X,[P1|P2]) --> adj(X,P1),adjs(X,P2). adjs(X,[],Y,Y). % The dictionary det(P1,P2,[(P2 :- P1)]) --> [A]. adj(X,size(X,large)) --> [large]. adj(X,color(X,red)) --> [red]. noun(X,person(X)) --> [person]. noun(X,hammer(X)) --> [hammer]. noun(X,tool(X)) --> [tool]. noun(X,man(X)) --> [man]. noun(X,woman(X)) --> [woman]. proper_noun('John') --> ['John']. proper_noun('Dean') --> ['Dean']. proper_noun('Mary') --> ['Mary']. proper_noun('Hammer1') --> ['Hammer1']. proper_noun('Hammer2') --> ['Hammer2']. % The functions in this file are the start of a natural language program. % Sections Copyright 1984, MICRO-AI. All rights reserved. % This natural language program parses simple sentences. % It knows "number" (i.e., whether a noun should be singular or plural) % It parses sentences such as: % Mary likes all men. % Mary likes a man. % Mary likes every man. % a big man likes Mary. % a man eats a apple. % a man eats big green apples. % It rejects sentences like: % Mary likes a men. % a man eats a apples. % A translator for the grammer rules. From C & M op(1200,xfx,-->)! op(700,xfy,&)! trans :- read_from_this_file,repeat,grammar,eof,!,fail. grammar :- read(X), (X = stop -> abort | true), translate(X,Y),!, assert(Y). grammar :- eof,!. grammar :- print("SYNTAX ERROR IN TRANSLATION"),skip(.). translate((PO --> QO),(P :- Q)) :- !, left_hand_side(PO,SO,S,P), right_hand_side(QO,SO,S,Q1), flatten(Q1,Q). translate(end_of_file,end_of_file) :- !,fail. translate(X,(X)). left_hand_side((NT , Ts),SO,S,B) :- nonvar(NT), islist(Ts), tag(NT,SO,S1,P), append(Ts,SO,S1). left_hand_side(NT,SO,S,P) :- nonvar(NT), tag(NT,SO,S,P). right_hand_side((X1 , X2),SO,S,P) :- !, right_hand_side(X1,SO,S1,P1), right_hand_side(X2,S1,S,P2), and(P1,P2,P). right_hand_side((X1 | X2),SO,S,(P1 | P2)) :- !, or(X1,SO,S,P1), or(X2,SO,S,P2). right_hand_side({P}, S,S,P) :- !. right_hand_side(!,S,S,!) :- !. right_hand_side(Ts,SO,S,true) :- islist(Ts),!, append(Ts,S,SO). right_hand_side(X,SO,S,P) :- tag(X,SO,S,P). or(X,SO,S,P) :- right_hand_side(X,SOa,S,Pa), (var(SOa),SOa = S,!,SO = SOa, P = Pa | P = (SO = SOa, Pa)). tag(X,SO,S,P) :- X =.. [F, ..A], append(A,[SO,S],AX), P =.. [F, ..AX]. and(true,P,P) :- !. and(P,true,P) :- !. and(P,Q,(P,Q)). islist([]) :- !. islist([_, .._]). append([A|B],C,[A|D]) :- append(B,C,D). append([],X,X). flatten((P1|P2),(Q1|Q2)) :- flatten(P1,Q1), flatten(P2,Q2). flatten(((P1,P2),P3),Q) :- flatten((P1,(P2,P3)),Q). flatten((P1,P2),(Q1,Q2)) :- !, flatten(P1,Q1), flatten(P2,Q2). flatten(A,A) :- !. % the parser parse :- inlist(L), parse2(L),!. parse2(L) :- (L = [stop]), nl, print('BYE!'), nl,!. parse2(L) :- (sentence(Z,L,[]) | (Z = 'I DO NOT UNDERSTAND!')), nl, print(Z), nl,!, parse. inlist(X) :- ratom(Y),next(Y,X). next(.,[]) :- !. next(?,[]) :- !. next(!,[]) :- !. next(X,[X|Y]) :- inlist(Y). % the grammar rules trans! sentence(sentence(NP,VP)) --> np(X,NP),vp(X,VP). np(s,np(N)) --> proper_noun(N). np(N,np(Det,Noun,Rel)) --> det(N,Det),noun(N,Noun),rel_clause(N,Rel). np(X,np(ADJ,N)) --> adjs(X,ADJ),noun(X,N). np(X,np(DT,ADJ,N)) --> det(X,DT),adjs(X,ADJ),noun(X,N). adjs(X,[ADJ1 | ADJ2]) --> adj(X,ADJ1),adjs(X,ADJ2). adjs(X,[],Y,Y). vp(N,vp(IV)) --> intrans_verb(N,IV). vp(N,vp(TV,NP)) --> trans_verb(N,TV),np(N1,NP). rel_clause(N,rel(that,VP)) --> [that],vp(N,VP). rel_clause(N,rel(nil)) --> []. det(N,det(W)) --> [W],{is_determiner(W,N)}. det(p,det(nil)) --> []. noun(N,n(Root)) --> [W],{is_noun(W,N,Root)}. proper_noun(proper_noun(W)) --> [W],{is_name(W)}. trans_verb(N,tv(Root)) --> [W],{is_trans(W,N,Root)}. intrans_verb(N,iv(Root)) --> [W],{is_intrans(W,N,Root)}. % the dictionary is_determiner(every,s). is_determiner(all,p). is_noun(man,s,man). is_noun(men,p,man). is_name('Mary'). is_trans(likes,s,like). is_trans(like,p,like). is_intrans(lives,s,live). is_intrans(live,p,live). is_determiner(the,_). is_determiner(a,s). is_trans(eats,s,eat). is_trans(eat,p,eat). is_noun(apple,s,apple). is_noun(apples,p,apple). adj(_,adj(red)) --> [red]. adj(_,adj(green)) --> [green]. adj(_,adj(big)) --> [big]. . proper_noun('Dean') --> ['Dean']. proper_noun('Mary') --> ['Mary']. proper_noun('Hammer1') --> ['Hammer1']. proper_noun('Hammer2') --> ['Hammer2'].  % This is the robot problem solver written by David Warren % To run the program type "run!." op(650, yfx, =>)! plan(X & C, P, T, T2) :- !, solve(X,P,T,P1,T1), plan(C,P1,T1,T2). plan(X,P,T,T1) :- solve(X,P,T,P1,T1). solve(X,P,T,P,T) :- always(X). solve(X,P,T,P1,T) :- holds(X,T),and(X,P,P1). solve(X,P,T,X & P,T1) :- add(X,U), achieve(X,U,P,T,T1). achieve(X,U,P,T,T1 => U) :- preserves(U,P), can(U,C), consistent(C,P), plan(C,P,T,T1), preserves(U,P). achieve(X,U,P,T => V,T1 => V) :- preserved(X,V), retrace(P,V,P1), achieve(X,U,P1,T,T1), preserved(X,V). holds(X,T => V) :- add(X,V). holds(X,T => V) :- !, preserved(X,V), holds(X,T), preserved(X,V). holds(X,T) :- given(T,X). preserved(X,V) :- numbervars(X & V,0,N), del(X,V),!, fail. preserved(X,V). preserves(U,X & C) :- preserved(X,U),preserves(U,C). preserves(U,true). retrace(P,V,P2) :- can(V,C), retrace1(P,V,C,P1), append1(C,P1,P2). retrace1(X & P,V,C,P1) :- add(Y,V), equiv(X,Y),!, retrace1(P,V,C,P1). retrace1(X & P,V,C,P1) :- elem(Y,C), equiv(X,Y),!, retrace1(P,V,C,P1). retrace1(X & P,V,C,X & P1) :- retrace1(P,V,C,P1). retrace1(true,V,C,true). consistent(C,P) :- numbervars(C & P,0,N), imposs(S), unless(unless(intersect(C,S))), implied(S, C & P), !, fail. consistent(C,P). plans(C,T) :- unless(consistent(C,true)), !, write('Inpossible'), nl. plans(C,T) :- plan(C,true,T,T1),!, print_plan(T1), nl. and(X,P,P) :- elem(Y,P),equiv(X,Y),!. and(X,P,X & P). append1(X & C,P,X & P1) :- !,append1(C,P,P1). append1(X,P,X & P). elem(X,Y & C) :- elem(X,Y). elem(X,Y & C) :- !,elem(X,C). elem(X,X). intersect(S1,S2) :- elem(X,S1),elem(X,S2). implied(S1 & S2,C) :- !,implied(S1,C),implied(S2,C). implied(X,C) :- elem(X,C). implied(X,C) :- X. equiv(X,Y) :- unless(nonequiv(X,Y)). nonequiv(X,Y) :- numbervars(X & Y,0,N), X = Y, !,fail. nonequiv(X,Y). unless(X) :- X,!,fail. unless(X). print_plan(X => Y) :- print_plan(X),print(Y). print_plan(X) :- print(X). % data add(on(U,W),move(U,V,W)). add(clear(V),move(U,V,W)). del(on(U,V),move(U,V,W)). del(clear(W),move(U,V,W)). can(move(U,V,floor), on(U,V) & V /= floor & clear(U)). can(move(U,V,W), clear(W) & on(U,V) & U /= W & clear(U)). imposs(on(X,Y) & clear(Y)). imposs(on(X,Y) & on(X,Z) & Y /= Z). imposs(on(X,X)). always(X) :- X. given(start,on(a,floor)). given(start,on(b,floor)). given(start,on(c,a)). given(start,on(d,floor)). given(start,on(e,d)). given(start,clear(b)). given(start,clear(c)). given(start,clear(e)). run :- plans(on(a,b) & on(b,c),start). run2 :- plans(on(a,d) & on(d,e) & on(b,c),start). % (11/17/83)    `Gtw VU v2F%1FF0CP3PPP!FV^ t؃]^Ëܸ1GVUF tFuv~vv~~D+EtyEȻYKKyً3x CC$CCE y3CC1W^~FuF]^^XZ^X33SS^XZ^X3SS y ؃πRP0CPSVWW^3؎W_E %E%] VW_^D %  DEËE E E E uE7E tm ]]]]E ueUUU )]WUFtF uv~JyvDv~;3SSSSSS_Nj, . t. .CCsCCt֋F-0@FFދF3FF܋!~]_" " " " WUF uv~FuFFF F} vi[Y3PPPPQS vT5Qv~;rwNNOOv~FFGGvFFYċF-?)FF1F~Cv~]_ ܊o w y2y:}ĹW9Wu KK$t w$t$t2 ܉G_ttt4^XZ[YU]MQSRP_D3۹%uPPP8PRS3PD%-?=#=|)D-8yT\D 3E_Xˎ& A.2 UWFVv~ u y ؃ y ރS 3SN;w r;w+@N^Yt tu t؃FV _] v UF fF FfF FfFV ] v ûWg؎Ћ&>O3L  UF t5x t/PV±$'@'Nuӱ 9nvnX&^3^.U+;&v^.PF^;r PvX^P^ƉƋ4F uF]øP PPD]3FF辝\vV~^X uv?k~D3F辥%vX u3]ËF=|3]ËF udF=FP-~v, uFvv Pv1X u Fv, ukPvYFP6QX?v9X u5FP6XF'PvYP>vX u Fv, ukPvYFP6Xv=X u5FP6QX~Fv|PvY+PvMX u# PF3H9v,3Pk~!vFvFv4X@PvXvv\ PvnX uPvEX u3PvVPvYF uvr~wv`vfF]Ë]dF F:v4X u"v#O~(vƸ-F=|tvƸ0vƸ.vvYF=|vvY+3F3Vv^;|vƸ0rvFF0PvX]vvQe~Sv, uF uvƸ.v, uIv:FF0PvXv'vL~v3VF+F ^ t3]Ë]v u%Pv^;t_F-Pv4^;ƸtHF u vvF0PF^;u F*Pv^;tv 4XFvF3FvPDD u-0PvƊX+V PvX^^ƉF.Pv^;ƸtHF uv*Pv^;tv 4XFvF3FvPBDD u-0PvƊX+V PvX^^ƉF3FlPvP#DD^;ƸtHF u vvPaF uFF Fv~FF 3PvV!F޸gPv^;tF=|F=PF^PvVPvދYvP\Pv.P\^ƉF܍v܋ƸEF=|v܋Ƹ-F؉Fv܋Ƹ+v޸ Pv!\P!DDF썆\FF uFF Fv~FF 3PvVF޸PvދF^^PvVPvދYvFށP\Pv/P\^ƉF܍\P!DDF썆\FFF9FF*F FFF FFދF u)F Fvt4vXZTFF EF=|v 4XRPvXZTv 4X3RPvXZTvލ\Pvt4F u2\F3RPvt4XZ^_;u;r v܁vDDFF uPvXVF^;rbPF^PPvX^PPvX^PF^Ɓ^+Pvg0PPF^+FPvePF^ƉFPF^PPvX^PPvX^PF^^+ƁPPvX^PPvX^PF^^+PPF+F^PvX.\FvDDFv 4XFvDDFF uF;FrFF3Ftv FܸF3FZFFܸF3FFCcsdDxXuUoObBfegizog\TIA6.`^F uF;FwF u-Vv܊^;t 0PF^;t,Pv4vvЃv,v,vVv,^;wPvVvvЃF;FwvvY+3FvvvvЃF uF u(v, uPvVvvЃvPv4vvЃc]4F̍v4^Fv4,X ux Pv̊^;t Pv̊^;t PvX6APv̊^;sZPv̊^;v Pv̊Yv́4XwPvXF҉FЉFθF̸FPv4^^ƉFv4,X uv̊ u<Pv̊^;t F́F<>Pv̊^;t F́FFPv4^VF^ƉXF=}P P PDv̊ uv́4Xv,4Xv́4X+$F̸>PvЊ^;tvЁ4X&F̸P(Pv ^;uPvv ^;uP*Pv ^;u,P P4 P@PFԉXFPvP ]FFF=|,vV^ƉƋ4 u v4XF=tPP FF uPv4X5^#PvtXPv^;:PFƊ^;tFFF=|5FF=|@vVPvX^P^ƉƉ^ƉƊPvVF^ƉƊPd^;t v4XF=t*PF^#PPvX^P^ƉƊD^;tPvtY PvX^P^ƉƊDPvXPPvtX^#^;t3Pv4^;tPvtX PvtX PvtX v4XPvtX5^# uvvPvX uF uv4VPPv4VFP^;PYPvtXvtPvtX ufPvtvtVFPvV^ƉXPvtX5^# u F uv4V#PPv4t#t!XZYRPvtXZTPZPvtX^# uvttXZ uv4t!,\t4XZvtVP}v4V!PmFPYPF^;|1PvVvt^ƉƊ^;t v4XPYPF^+ƙRPvtTY[ӉTF]ËF u#v4 u v4V v ]Ë][PvtX^# uPvtX^# uPv4^;tqvtvtV PZ PPLvt Pvt^Pvt Xvt XPvtX hv4VDDPvtXPvtX^# u Pvt^;tvt vt  vt ]øRPvtt XZY[RFZ3FFF=|vttPvX^RPvtt XZ^_^_;u;rPvX^Pvt^PP FF3RPv4t!XZTPZv4V!PFF=t F=t-3PPPvX^Pvt^P3F F u vF u@PvtY PvX^Pvt Xvtt vttXZ^_+RPvt X^_;u;w&vtt vttXZ^_+RPvt XZ] PvtX^# ugvtvt X^;|Pvt vt^ƉXvt XRPvtt XZ^_RPvttXZ^_;u;r.vt XRPvtt XZ^_RPvtXZTPZFvt PYPvX^^;|PYPvX^Pvt^PPvXRPPvtt XZY^_RPv4t!XZTPZv4V"P u@PvtY v4XIPvtY#]v F uPvvBP P'PvF]Ë] Pv^;t Pv^;t v4XF-Pv^;t F+Pv^;u v,4Xv4XVF0Pv^;}9Pv^;~4v4^0RP RPvv&XZ^_׉VFF uvvXZ؃VFvvXZ]Ë]UNV]vvX^Fv F uPvv=F]Ë][PF^P> u]vNFPvtX5^# u v4Vvt u vtVvPPvX^P^ƉX]Ë]FF=|0vV^ƉƋ4 u v,v4Xv#]ePF^+P]Ë]IvvDDPNP]ø]3]] PF^+PFPvtX^# uO PvtX^# u v9Pv4VP^;@PvtY @PvtX^# uPPX]Ë]cFPPvVPF^+P< ^;uFF]Ë]#FFFv uv4^PdFF uFPvY F uFF uFPvY awrb _FPRPFFPvFF=u F=t3PFFPvxFVF=tF=uPRPvF=u F]ø]Ë]vVvFPQ1P]Ë]PPvVPF^+P ^;uFF]Ë]XPvY+v4VF^;uIP PP60Fv4 uvVv4^;r v4Fv4VvXFPvXPvtX^PF^ƁPF^;t+PvtX^PvtYv4VvXFFv4FPvtX^PF^ƁPF^;t(PvtX^PvtYv4VvX]FP0^;ƸvH uH uP9PF^;ƸvH uHPX]Ë]X[X'o_vDDFPvtX^# u 3ҋ]øPvtY#F Pvt XRPvvvtt XZ^_^_׉VFvvXZVFvt XRPvtt XZ^_RPvttXZ^_;u;r*vt XRPvtt XZ^_RPvtXZTvvvttXZ^_׉VF3ҋ]'aNvt X u$vtt vvXZ^_;u;r9vt XRPvtt XZ^_RPvvXZ^_;u;sR PvtX^# uvDDRPvvXZ^_##RPvt XZTvt 3vDDvtt vvXZ^_+RPvt XZvt vt X^;vt vt XvvXZ]Ë]*FP!PF^ƉFXF =|RPvvXZ^_;u;r FvvXZ؃VFRPv XRPvvXZ؃RP3ݍ^YƉƊPv,4^XF ؙRPFu5]XZU ujvvXZVF3RPv X3RPvv0܍^YƉƊPv,4^Xv X3RPFu5XZU uF u-Pv,4^XP!PF^+F^ t3FFPvvF]Ë]P%PFF u:PFƊ^;tIvP~FF=A}F=P~F@PvXgPvY P PvtV.vVPvtVF uvVPvt V( uF]v]Ë]v4Fv udv4^PFF=.t:F=!|]ËF uv,4XFPv4^XFPvX]Ë]jPPF^^#ƉF60Fv4F uvVvtX^;sPF^PvtX^;sMPvX^PF^ƁFv4VvXPvtX+F^+PvtXFPvX vtXFv4VvX FFSF uPF^PF u%FPvtXFPvXPvYF]Ë]U؎v~N;rNO]ڍvVvPQ1PY߃]Ë]vDDFPvtX^# uOP P-PDD3FvVvX^;r3VvDDF^;|vƋFvPvtX^# uF=tvt ,v,nF= tR3VvDDF^;|JF= tv 0vtFPvtY F= t@PvtX^# uPFPX]Ë]ظPvtX^# uPvtY#vD]Ëvt vt X^;} PvtX^# uvDDPvtX^# uOvtvt X^;t*vtXRPvt TY[ӉTvt 3vt X uvt 3vyDDvt vt X^;}]Ëvt PvtX]Ë]P64X^Pv^+PF^;s3]Í6464X^+ƉFv6YF]Ë]^[S'ow3U؎~NF]vv4VvPvX^PvYPv4X]֍vVvvV.P܃]Ë]֋vPv^;t+v4^ u]Ív4XvPv^;r]ø]Ë]NFFv4^Pv4^X uF]Ë]v4XFv4^ uPF+F^ t3]Ë]FFv4,X u v4^Pv4^X uPF^;t PvXF]Ë]eՊFPA^;~ ZPF^;~ PvYF]Ë]'ՊFPa^;~ zPF^;~PvYF]Ë]PF^+PԃF u!PvtY FPvtXFF]Ë]vԃFPvtX^# uUP PPԃPvtX^# uwFvVvX^;r^ Pv^;tPvtX^# u Pv4VZv4^Pv4V@v4XFvVvX^;rX Pv^;tPvtX^# u v Ptvv4^P]v4Xvt vt X^;vt vt X@PvtX^# uPFPX]Ë]Ӌvtvt X^;}Ovtvt XvevtXRPvt TY[ӉTPvt XPvt Xvt X uPvtX5^# u3Pvt Xvvt X u Pvt X PvtY FPvt 4vt^ƉX]"FP P DDFFPvXv33PvXv3v3Pv X|PDDFFPvXv3WPDDFvv35P9DDFv 20F]Ë]9FV^PDDFvFPvtXF]Ë]vV^PDDFv3vtF3PvtX3PFPvtXXPvtXF]Ë]3Fv uvƊPvYF]Ë]SvDDFFP65X4F3PvX^;up3VvtVvU^;uDVF^;tVv^;uVv^;tF]Ëvt FFPDDFFPDDPvtXvvtV5FP65X4Vvt Xvt3vtvt3FPFP65XXF]Ë])F;6uP3FF;|?FP65 X4tVF^;tFP65 X4]Ív2V6^; 3P\P;P}DDFPP65 XXPvtXFPvtXF]Ë]ZPDDFFPvXFPvXF]Ë]PDDFFPvXFPvXFPvXF]Ë] u3]þVvt4^;tVvt4^;tVvt4^;tvt4FVvt4^;tXVvt44^;tVvt44^;tVvt44^;tvt44F 3PyP9Vv^;tvD u ! u 3PP9F;tFP67 tX67 t7 wF3Pvt^;tFPvtX7 =vtF3Pvt^;uvtFFPvtX7 vt!F]Ë]3PvX^;t]ËvP]Ë69 VF^;t]vPDD]Ëvv]8FFF6![PVv^;tPv4Vv4FVv^;tv uk6v4V6L ^;t96L PVN += ^ t3^PP6!L FN v4tVP6!Q6VF^;u>P6!jVv^;uP6!JPv6!]PMF]vt44XFF;F|6!(Pvt4PJvt4tVMDD6! Pvt44vt4V*vt44XFF;vt44XFFFvt44XFFFvvt4Vr6! PBvt4tVDD6! P#vvt4V/wvt44vt4V 6! Pvt4tV(DD4 P6!#vt44F^;|6!)Pl]FFPF^;|APFPvX4VW6!,P'6! Pv3VF^;uPFPvX4V]o3PvX^;t6!_P]Ë6VF^;t&P6!z]ËvPqvP_vtV)P6!IjvtV3P6!1RvtV<P6!:vtV6!&#'6!'PvtVqDD6!'Pv uj6v V6L ^;t66L PVN += ^ t3^PGP6!O6N v6L nv4tV6!!J69 VF^;t6KP6!v4NP6! vSDDv4F6^VF^;t76!{PPv4V6!}PVv^;tDvv6!(PwvPvV6!)PPUVv^;tIvtV6!6!(PvPvV6!)P߃ vvvv4VFFPvX4 ucQP6!y߃PvPvX4VFPvX4 uVP6!-߃6!.P:߃?vPYP6!ރ'#).lj]FFvvF]Tvvv6! PރP'DD],FF3Pvt^;uXvtVqDDFFP65X4Vvt XvtVvtXFPFP65XXv ]3FF=|3PFP65XXv]wPEDDP;DDWP1DDP'DDPDDwPDDP DD5PDDPDDPDD9 3P3P ; ; P6DtX6DtDP6; tX; P6; tX]ſvDVF^ƉFFPvXF PvtXF;C r4l;G ~FP6lP6A XX PmdDD]OvDVF^ƉF3Pv4^;t3]Ëv4L vtN ]Ë]6xt4TXZvPiVv^;tVv^;tVv^;tvF^;ƸtH]=Vv^;tQ69 VF^;tF P v469 VF^;tFP v4X^;ƸtH]vVF^ƉF3Pv4^;uv4FvtFVv^;tvVF ^ƉF3Pv4^;uv4FvtF F;Ft]ËF ;Fw^FPvXFPvtXF ;C r4l;G ~FP6lP6A XX P,bDD]ËFPvXF PvtXF;C r4l;G ~FP6lP6A XX PaDD]þVv^;tvDPvD^;u3]3FvDPF^;~Mv FPvX4VvFPvX4V= u3]Ív]Vv^;tZv v4Vvv4V u*v4Fv4F3]T3Vv^;tvF^;ƸtH]*'K3vtrVv^;tvVF ^ƉF3Pv4^;taFPvXFPvtXF ;C r4l;G ~FP6lP6A XX P_DD]v4FvtF 3]Ë]腺Vv^;uDvDVF^ƉF3Pv4^;tv4FvtFFL FN ]DvFvVvD^;uF=u/P4DD3]þVvD^;`P4DD3]øFvDPF^;~VFPvtX4^;tNvFPvtX4VL PFPvXXN PFPvXX<FPvtX4VFPvXXFPFPvXXv7F=t'vDPFPFPv4Ѓ]FPFPv4Ѓ]Ë]萸6E VjF^;} P]DD3Vv,^;u3P6jP6= XX]>3FlFjP6= XC vtFFF6E VjF^;} P]DD3Vv,^;u3P6jP6= XXC FpnjF3Pv4^;tF6|t4TXZv4FFFVv^;tvvL FN F62VF^;t1npv3P P6pX^P6? XtX[vPv4F uvK ev u3Pvvv4 uvlFFFv4FVv^;tvvV6L ^;tV6L ^;tV6L ^;t L F0PP<Ӄ3v6N P6L vlVv^;tXv u3Pvvvvvx uvlFFF)v4F uvK 3P0DDvPv]茳EjP6= XC jF3PvX^;ttvDF6E VjF^;} PYDD3Vv,^;u3P6jP6= XXvv6C vt4Vj uK uv6C vt4V3F6I V6p^;t P-YDD P6pX^P6? XFFPvXK uV P3PvtXvtFvtVvtXvtnvt FlFvtF@Fjl;F3P6l,P6A X4XvtF\n;t P6nX^P6? XFvtXnn;tt rF P6nX^P6? XtXFFP6= XFvtXK u,K V Pvv44V~6V ,v4FF u vDD]ÊK uPvv+p=|$ uF u PDD]ø P6p4,X^P6? XFv4FvtXjvtFvtXnn=t3F P6nX^P6? XtXFvt XFFP6= XFv4Fl;F3P6l,P6A X4XvtXK uK V F]V =P| 6V 6!6vP_΃V FF=u6!|P?΃v,6!6vP΃vPvF]蘰!F!F uP P̓3FF;Fu{66VFP65 X4t^;tKFP65 X4ttVPՃrP6= XVPFP65 X4Vvz $PDDF!]ů3v,P6!̃jFF=}vZP6!̃69 VFP6= X4^;t$FP6= XtV`P6!̃VFP6= Xt+= ^ t3F u VFP6= X4^;tviP6!.̃rP6!̃FP6= XtVPFP6= X4VJv,v]艮wzP6!˃pFF=u6tV PvX^P6? XtX^;t rF- P PvX^P6? XtX^P6? XtXFv PvX^P6? XtvP6!'˃ FP6= XVP PvX^P6? X44VQ PvX^P6? XtXP6= XVP6!ʃv,3wP6!ʃ]QtFrFnFlFC Fptjr!Ft!!!Fv!!\Z3v3V 3zx~|P PDD uvvvq3vF!F!XZtprjFtFrFnFlFC ]YFE VF^ tI VF^ tG P6E Ń= P6I qŃ? P6G _ŃA 3P6= X^;t3P6? X^;t3P6A X^;tPPȃŋ]詫vPvtVDD u vYDD]ËF]øPLDDF69 VF^;tFP v4vXF]vvV6L ^;t|6L PVN += ^ t3^PPFP ԃFPDDFFPFPPtڃF5 uvDD]F]6N 6L ]ËvPDDDFvv4VPvXFvFMPDDF3FF3PDD]#萨x^vPvXF;F~<vFPvX4VPFPvXXvF]Ë]蘩Vv^;tvvL FN FVv^;u6 Vv4^;u23Pv7؃Fvv{PFPvXXMFPvv4VVFvv4V+PFPvXXF]Ë]貨Vv^;t6>Vv4^;tJPvv4VFvv4VPvX&3P3P.׃FvvrPvXF]Ë]hVv4^;tU35 FF5 v4Vv4VFvvDDF5 3].P!PPă3]Ë]yjVv4^;t35 FF5 v4Vv4VFvv44FvtVvXFPvtX3F5 3]^PQPPă3]Ë]Vv4^;uVv4^;tPPPÃ3]Ë69 Vv4^;t v4Vv4tXFVv4^;tVv4^;tVv4^;tF=t.3Pv4Vv4Vv4V]{Vv4^;tv4DPF^;~Dv4VFPv4X4Vv4Vv4Vc]3]Ë]I F=PPPvƒ3]vDDFFPvtX3FF;F|F;|)FP6X X4VFPvtXXFPPFP̓PDDFvtF3PFP{DDPFPP)ԃPvtXFP6P6X XXFPFPvtXXv)F]Ë]#Vv4^;tIVv4^;tVv4^;tVv4^;tVv4^;t3V69 Vv4^;t v4V v4tXF^;t&3Pv4Vv4Vv4V]3Vvv4VF^;t3]ËjP6= XVvv4Vv4V2vYDD]þVv4^;uVv4^;uPPPᅢ3]Vv4^;tVv4^;tVv4^;tN3Pv4Vv4Vv4Vs3P69 v4Vv4VR]Vv4^;t[3Pv44Vv4Vv4V v4DP69 v4Vv4V]PPP׾3]Ë]3F6Vv4^;t3]þVv4^;tgv4L v4N V6L ^;u6VL ^;u2L FN F6N 6L 4ViV6L ^;tV6L ^;tV6L ^;t*6L tVGP6 vVɃ PyDDFV6L ^;tc69 VL ^;t&6N JP6 vVqɃ P/DDF)6L 4MP6 vVEɃ PDDF]PPPPJ3]vv4V]vP6 X33Pv P PDDP[σFVv4^;tVv4^;tVv4^;tvv4^;ƸtH]ZVv4^;t*3Pvv4Vv4VD߃]PPP83]PPP3]Ë]ŞVv4^;tIVv4^;tVv4^;tVv4^;t^69 Vv4^;t v4Vv4tXFF=|v4tVDDPF^;3]ËFPv4tXPvXv3PvP6X^;ƸuHPPFPP^̓FVv4^;tVv4^;tVv4^;tv4VF^;ƸtH]?Vv4^;t'3Pvv4Vv4VH݃]øPPP?3]Ë] v4Fv4F P6nX^P6? XtXFF=u PvX^P6? XFjP6= XFPDDv6Vvvh݃ uPPP蒹3]Ëv44VvXVvtX^;t= PvtX0 PvtX^P6? XtXP6= XVvtX6FFF PvX^P6? XtXF3P6vvۃ]Ë]莛vPvDFvv܃ u6N 6L R64-PFP^ăFPDDF3PFPFPPʃF3Pvvv;ۃ]lvge3FF;F~(vFPvX4V,v]袚Vv4^;u>P1PPȷ3]þVv4^;uVv4^;u{PnPP耷3]Ë69 Vv4^;t v4V v4tXv4Vv4VY669 v4Vv4Vڃ]Ë]躙aVv^;|zVv^;]Ív4 u>vP6XFVF^;u VF^;u]]Ë]-FFF u3VvtVvtVIƒ^;t1VvD^;t F]FFvt FPDDFvt Vvt XFPvt XvtVvtXvtvt3F]Ë]k6ZtVPP襵]S6!DDFPR V6!ѳDD^;uP6!X^;t 6 -6!FP Ã]c %]ϗ3FV6!XDDFP6X^;tFP PvX^^Ɓ0F6!FPƒF]Ë]l F3!6!DDFP6XFVF^;tVF^;t1V!^;|6!FPvX6!FPv36!]Ė F3!6!IDDFP6!;DDFP6X^;u\VF^;t6! DDFPlFv Fm FdVFP6X^;t36!FP6OFVF^;PPptnbV!^;|6!FPvX v36!]衕 F3!V6!"DDFP6X^;t1V!^;|6!FPvX6!FPBv36!]F=}6,P6!X4]6!莯DD u6!iDD8]6!6!TDDPÿP6XFPPsDDFPvXF]  u PqDD u!P PPÃ]FPtDD PtDDFVF^;t!P PPÃ]Yp6!药DDP6 X6 3 u!P PPnÃ]0PPOM!P PP"ÃF uVv^;u vDDFF]Ë]3=|FP6P6!XXP(P]3XZ! u9vFPPF u V6!ADD^;u$;v6 6!ZPPƯ F u.V6!DD^;uP!Pt]C$F6!DD u  u{PP\P !P,F]Ë]vFAPF^;Ƹ}H uH uPZPF^;Ƹ~H uHPX uH tP_PF^;ƸtHPX]Ë]耑v4FF u3VvtVv4tV薺^;tGVvD^;tVvD^;tFPvX]Ëvt F3]Ë]v4FF u3VvtVv4tV ^;t[3VvD^;tVvD^;tVvD^;tFPvX]Ëvt Fz3]Ë]Xv4FF u3VvtVv4tVn^;tGVvD^;tVvD^;tFPvX]Ëvt F3]Ë]ɏ3VvtVvtV^;tPvD^;ƸtH]vtvtX^;Ƹ|H]Ë]s)F6,VF^;t ]vDD6V;DDFF6 VF^;tF6$VF^;t[PDDFFPvX6VDDPvX6,V^;uPPF]vtDDP聼DDFFPvXPvX6VVF^;t[PBDDFFPvX6VFDDPvX6,V^;uPP$F]N6,VF^;t0P׻DDFFPvXPvXPPF]Ë]跍6VDDF`F6 VF^;t2vPDDFFPv,PvXXP6(VF^;t2vPDDFFPv,PvXXPPF]Ë]FVv^;tIVv^;t6*VF^;t IF6&VF^;t06(DDF6(VO^;tPP6^VF^;tc6`\DDF6`V^;t9P DDF^PvXFPvXFFyPP vtVDD uvVfDD u (V6!6!gDDPֶ^;tvDDFeFVv^;tVv^;tVv^;tVv4X^;vDDvDD]Ë6NVF^;t;Vv^;t FF{vDDvDDPv襼F6RVF^;tRVv^;t v4XPvXFFvvDDvDDPvCF6HVF^;t$vVDD u FFv-DD6JVF^;t$vVSDD u FFvDDQ6LVF^;t$vVDD u FFvDDvDDvDDPv臻FF6&VF^;t"3PDDFFPvXFFveDDUFVv^;uVv^;uv3DDF]ÍvVDD uvv{ u/vvܺFVv4X^;}F]MvVDD uvv) uvDDPvv輺FvDDF]%]輈FF6VF^;t7PyDDFFPvXPvXF]vVv4^;tF]Ë6Vv4^;tv4FPDDPvXv4FFPvXPvXF]Ë]ÇP3PvރFv6vNڃv读DD]萇3PvރFvv蘹DDF! u ! uv6!!3]/h35 FF5 36(DDF64Vv4^;t3Pv4V60Vv4^;tPv4V6"Vv4^;tv4F6@Vv4^;t3Pv4V;6.Vv4^;tPv4VTv{DDvDDPPvDDF5 3]҅3! uO !P|DD u3!PiDD uE6!CDD uSPpDD]r6!DDPvX6!DD u8]Ív33PPFPPٴ]Ë]v PP[] 3vP69 VF^;t F] vtX]vvqŃ u6N 6L ] * PyDDVv4^;u \ PUDDVvD^; P6DD3FvDPF^;|<vFPvX4VPFPvXXvv4tVv4v4X^Ƌ]Ív4v4X^+Ƌ]Ív4v4X^]Ív4v4X^ t]Ív4v4X^ tЋ]3Vv4X^;| PRDDFv4XFF=uv4FNj^v,F]Ív4X]Ív4X؋]ø PDD*'聁eJ1 PDDK3]辂v4Vv4VF u3]v69 v4Vv4V|Ã]Ë]kVv4^;tVv4^;tVv4^;tIVv4^;tVv4^;tVv4^;t v4tVv4tV]Ëv4Vv4VF u3]Ëv4Vv4V|F u3]ËF+F]Ë]T uH4 uH uP!3Pvv^;Ƹ|H uHPX]Ë]  uH4 uH uP!3Pvvv^;Ƹ~H uHPX]Ë]辀 uH4 uH uP!3Pvv+^;ƸH uHPX]Ë]s uH4 uH uP!3Pvv^;Ƹ}H uHPX]Ë]( uH4 uH uP3Pvv^;ƸtHPX]Ë] uH4 uH uP3PvvR^;ƸuHPX]Ë]Pv4^;ƸtH]Ë]Pv4^;ƸtH tPPv4^;ƸtHPX uH tPPv4^;ƸtHPX]Ë]Pv4^;ƸtH]Ë]~v4P]3]X}]~Pv4^;ƸtH]Ë]~Pv4^;ƸtH4]Ë]~6Vv4^;t3FVv4^;tq3Fv4L v4N V6L ^;tV6L ^;u( v6N 6L 4Vdà PDD3]þVv4^;tA69 Vv4^;t v4V v4tF^;ƸtH]þVv4^;t+v69 v4Vv4V}]3]Ë]&}PP PF]}S]}3P6\v4Vv4V uVv4^;tVv4^;tVv4^;tv4\Z] v4Vv4^;t]ø Pz PP蛙3]3]Ë]8|Vv4^;tVv4^;tVv4^;tv4] P PP3]Ë]{Vv4^;tVv4^;tVv4^;tv43] P PP記3]Ë]P{3FF=~73VvFP6iX4Vg^;tF]Ív]Ë]zvtVXDDP65XFvVv4^;uv4t FP菨DDFFPvt XFPvXvtVvtXvtFFPvtX]hzVv4^;tVv4^;tVv4^;t3 P& PPR3]þVv4^;uv4P6iX4V诣DDPv4P6iX4VPHFv4469 v4Vv4Vy uH uP)3Pvv4Vv4VI uHPX]þVv4^;tNVv4^;tVv4^;tVv4^;t3]þVv4tVbDDF^;te PX PP3]Ëv4FVF^;tVF^;t vVDD uB3VF^;tVF^;tVF^;t vVDD u2VF^;tVF^;t vVDD u969 Vv4^;t v4Vv4tvX]3FP69 Vv4^;t v4Vv4tvp]Ë]Ww uH4]>wxȋ]6wVv4^;u P PPZ3]þVv4^;u P PP*3]3Pv4tF^;t3]ËjP6= XFvDPDDvvv4Vv4V贶]Ë]kv3Vv4^;u+ P PP萓3]þVv4^;uf PY PP`3]3Pv44F^;t3]ËjP6= XFvDP6DDvvv4Vv4V絃]Ë]u3Vv4^;u P PPĒ3]Ëv4Vv4Vv4Vv44VM]Ë]v4Vv4^;tv4tVvX] v4tF9 P, PP蹏3]Ë]\rVv4^;t` PS PP膏3]Ëv4VBDD]Ë]rVv4^;tVv4^;tVv4^;t#v4tV%DD3Pv4tX]ø P PP3]Ë]qVv4^;tVv4^;tVv4^;tv4tV趠DDP65XFv4 u>v4Vv4^;tv4t VvX] v4t F P PP)3] P PP3]Ë]p3Vv4^;uUPHPP܍3]Ëv4P69 v4Vv4Vf]Ë]UpVv4^;tP}PPw3]3Vv4^;uPPPH3]Ëv4F69 Vv4^;t v4Vv4tXF3FF;F~03PFPvtX4^;t3]Ívv4VFPvtX4Vv4Vv4VP]Ë]:oVv4^;t2v4P69 v4Vv4V]PPP23]Ë]nv4VPv4VB]Ë]n=FVv4^;t"3Pvv4Vv4V辮]vv4^;ƸtH]Ë][nVv4^;tVv4^;tVv4^;tFv4tF6!蟉DDPF^;u6!蟈DD u3]]?P2PP 3]Ë]m؉F3Vv4^;t"3Pvv4Vv4V谭]vv4^;ƸtH]Ë]Mm6(8DDF36"Vv4^;t.v4F3PvXvDDFF6!菇DD uv4Vvv4Vv4V軭]Ë]l3F3FF;F|tVFPvX4^;t#FPvX4tV_P6!袉(FPvX4VPFPvX4V說v]Ë] lvvvY6! Pd]Ë]kVv4^;u3]3v6! P'v4tF3PvX^;uPvt4Vvt4 uvt4 ubP6!蜈hP6!苈FFPvtX4 u6PFPvtX4V葥mP6!=vPFPvtX4V[qP6!vtFv]Ë]j3FF=|`FP65X4FF u6vD u vt u vVZDDvt Fv]jVv4^;tVv4^;tVv4^;tPtPP3]6!v4tP ]Ë]iVv4^;tVv4^;tVv4^;tVv4^;tL69 Vv4^;t v4V v4tv4t^;ƸtH]bv4VřDD u4v4tP69 v4Vv4V]PPP텃3] v4VdDD uVv4^;t69 Vv4^;t v4V v4tXFF=| F=PPP[3]ËFPvXv3PvXP6X^;ƸuHP3PPFPPrPv4Vv4V ]PPPᄃ3]Ë]gv4Vv4VtF uP=DD3]Ív, u6! P誄]Ë]%g6! P苄]Ë]g3FF=|&PvX^P6!Xt3v/t!v!]f3FF;/~53VPvX^P6!XD^;tF]ÍvV6/^;t ]/]Ë]Ef3FF;/~6vVPvX^P6!X4^;tF]Ív]Ë]eVv4^;tVv4^;tVv4^;tPPP傃3]þVv4V?DDF^;uVPvX^P6!XD^;tPPP萂3]ËF;3t]øPvX^P6!Xtt!!F3PvX^P6!X4p!]þVF^;tPPP 3]3P6!V3P3P3PPv4tVr t!^;tPPP3]Ëv4VPvX^P6!XXt!PPvX^P6!XtXPvX^P6!XtF3v4p!t!!]Ë]c!t!!]cVv4^;tVv4^;tVv4^;t8P+PP׀3]þVv4V1DDF^;uVPvX^P6!XD^;tdPWPP肀3]ËF;1t]øPvX^P6!Xtv!!F1PvX^P6!X4r!]þVF^;tPPP3]3PPv4tVr~v!^;tPPP3]Ëv4VPvX^P6!XXv!PPvX^P6!XtXPvX^P6!XtF1v4r!v!!]Ë]aVv4^;tVv4^;tVv4^;tPPP~3]þVv4VDDDF^;tPPP~3]þVPvX^P6!XD^;t!!t!3:p!!v!1<r!PvX^P6!XtV{DDPvX^P6!Xt33PPvX^P6!XX]Ë]`3=t5P(PP}3]øP63X^P6!XtV{DDP63X^P6!Xt33PP63X^P6!XX!!t!3:p!]Ë] `1=tePXPP=}3]øP61X^P6!XtVdzDDP61X^P6!Xt3!v!1<r!]Ë]_Vv4^;t^3=t3P6:v4Vv4V莟,3PP63X^P6!X4Vv4Vv4V_]PPPS|3]Ë]^Vv4^;t^1=t3P6<v4Vv4V,3PP61X^P6!X4Vv4Vv4VΞ]PPP{3]Ë]e^6!yDD]Ë]V^Vv4^;tVv4^;tVv4^;t^!F3PPv4tVy!^;t PPP%{3]56!]xDDF!]*PPPz3]Ë]]!F3P6!V3P3P3PCPvO !^;tRPEPPz3]Ê!FP6!X^;ƸtH! 3PvX^;t F!F!!!$6!wDDFt!!F!]Ë]\!F!Vv4^;tVv4^;tVv4^;tzPmPPy3]73Pv4tV u6!v4VCF!]3]Ë]#\3PvX^;t3]3Vv^;t3]3PvX^;u x!PvXvDDFF=} F3PvX^;uevvFP҅ +FFv|DDFF;FFFF=FPvvvV芅v3FFvvx!Pl6x!v3vx!Pv]Ë][vP瀃Hu]ZPP=x0u]Zv3P踀3ljv3pn!!XZP6!X^;ƸtH!P!Py]mZ@PPwIPPwyPPwPPwPPww PPiw:PP[whPPMw]Y3P3PF6FtVvtXFP6FtXP艈DDFPvtX3PvtXFPvXFPvXFPvX]gY!3P6!V3P3P3PoPv# !^;tvDDF! F!!!!PρDD u%6!qPP5v(s6!ssDD! u-6!3Pv讂DDPvvDDPXP]XFݗ|v!!FF;F||-VFPvX4^;tsVFPvX4^;t2FPvX4VdpDDFF=| P}DDBrvyv蓫DDPPsFF;F|A-VFPvX4^;u3PFPvX4V-vt!!!3!P6!X^;ƸtH! u!!PDD u^]&W2V6^;t P#DDPP6!XXPP6!XtX]Ë]VVv4^;t =tPPPs3]øPdDDF5 F35 v4Vv4V輪PvXF5 PvX6VP6!X4^;tFPP6!XX"FPP6!XtXFPP6!XtX3]Ë]U3PP6!X4Vv4Vv4V蚖]Ë]U6,P6!X4V胉DD]Ë]]UVv4^;t1P$PP}r3]Ëv4FVv^;uiP\PPIr3]þVv4^;tPPPr3]Ë6Vv4^;tv4FrPhDDFFPvX5 F35 v4Vv4V覨PvXF5 PvX]Ë]BAD FILE$%03dcon: TOO MANY ARGS$warw REDIRECTION ERROR$cALLOC$FREE$READ$WRITE$Too many variables in clauseBad principal functor in clause headCannot redefine a predefined function ERROR: Free - unknown type %d \b\n\t\%c\%d, .._%d, ..%s, .. ERROR: Unknown operator []prefix %sinfix %spostfix %s_%d%d%d :- , # %d #niln,...()[]?-?!!_end_of_fileinputoutput:-:-truerepeatfileprefixinfixpostfix++--|: > {};->&=/==..*/mod^Trail overflowTrail overflowTrail overflowTrail overflowEval - incorrect number of arguments to built-inEval - too many arguments for built-in predicateStack overflowStack overflowERROR: Lush - principal term must be an atomCannot execute goalStack overflowEnvironment stack full** no %s = ** yes ------------- VARIABLE STACK ------------- %3d : %d %-3d ------------- ENVIRONMENT STACK ------------ %3d : %4d %4d %d ============================================ ERROR: Not enough memory for PROLOG86 _%dHERE ERROR: %s Assert - argument must be compound ERROR: %s Asserta - argument must be compound ERROR: %s Arg - bad argument ERROR: %s Functor - too many variables_%d ERROR: %s Functor - 2nd and 3rd arguments must be variables ERROR: %s Functor - first argument must be a functor%s%d%d ERROR: %s Concat - list members must be atomic ERROR: %s Concat - bad second argument ERROR: %s Concat - first argument must be a list ERROR: %s Char - bad argument ERROR: %s Ancestors - incorrect argument_%d ERROR: %s Numbervars - second argument must be an integer ERROR: %s Numbervars - third arg must be an integer or variabletermargfunctorassertassertaassertzconcatcharancestorsnumbervars%sInvalid character in stringIllegal symbolToo many symbols pushed back SYNTAX ERROR: %s SYNTAX ERROR: %s: line %d: %s SYNTAX ERROR: EOF unexpected Malformed list endMalformed list endMalformed listMissing ,Missing )Missing }Input must be a question, command or assertion ERROR: %s Arith - unbound variable in arithmetic expressionArith - unrecognized arithmetic operatorArith - too many argumentsPower - negative powers not permittedArith - unknown arithmetic operationArith - incorrect arithmetic expressionLength - first argument must be a list><<=>===<>isintegeratomquotedatomicnonvarlengthvar ERROR: %s Prompt - second argument must be an atom ERROR: %s Trace - cannot trace a non-atom ERROR: %s Untrace - cannot untrace a non-atomxfxxfyyfxfxfyxfyf ERROR: %s Defop - 3rd argument must be an atom ERROR: %s Defop - bad operator typedefopspyunspypromptaborthalttimedump ERROR: %s Definition - first argument must be an atom ERROR: %s Definition - second argument must be unbound ERROR: %s Next_clause - first argument must be a clause ERROR: %s Next_clause - second argument must be unbound ERROR: %s Head - first argument must be a clause ERROR: %s Body - first argument must be a clause ERROR: %s Unlink - argument must be a clause ERROR: %s Unlink - clause not found ERROR: %s Free - cannot free unbound term ERROR: %s Free_proc - argument must be an atom ERROR: %s Remob - atom not found ERROR: %s Remob - argument must be an atomunlink_clausefreefree_procremobheadbodydefinitionnext_clause ERROR: %s Nvars - first argument must be a clause ERROR: %s Goal - first argument must be an integer ERROR: %s Goal - second argument must be a clause ERROR: %s Offset - first argument must be a variablenvarsgoaloffset ERROR: %s Skip - argument must be an atom%s :- :- , . ERROR: %s Putc - argument must be an atom ERROR: %s Ascii - bad argument ERROR: %s Ascii - number out of range ERROR: %s Ascii - bad argumentTab - argument must be an arithmetic expressionwritegetcskipputcasciitabratomreadprinprintpplistingnl ERROR: %s See - argument must be atomic ERROR: %s See - file already opened for output ERROR: %s See - too many open filesr ERROR: %s See - cannot open file ERROR: %s Tell - argument must be atomic ERROR: %s Tell - file already opened for input ERROR: %s Tell - too many open filesw ERROR: %s Tell - cannot open file ERROR: %s Close - argument must be atomic ERROR: %s Close - file not open ERROR: %s Seen - cannot close standard input ERROR: %s Told - cannot close standard output ERROR: %s Seeing - argument must be unbound variable ERROR: %s Telling - argument must be unbound variablew ERROR: %s Save - open failure ERROR: %s Save - invalid file namer ERROR: %s Consult - cannot open file ERROR: %s Consult - first argument must be an atomsaveconsultseeread_from_this_fileeoftellseeingtellingseentoldclose FILE ERROR: Cannot open %s PANIC!! - INTERNAL PROLOG86 ERROR! ERROR: %s PROLOG86(tm) Version 1.0 Copyright 1983 ALL RIGHTS RESERVED MICRO-AI Moraga, CA rERROR: Fatal error while loading %s FATAL ERROR: Stack too small prolog.libinput fileOpen_bag - too many open bags ERROR: %s Write_bag - argument must not be a variable ERROR: %s Conc - 2nd argument must not be a variable ERROR: %s Conc - 1st argument must be a list ERROR: %s Conc - variables not allowed in listopen_bagwrite_bagclose_bagfree_bagconcQ NO CORE$ $$@Y@@חA7yACnF?O8M30HwZ?sOu ?{Gz?-C6?:0yE>ؗҜ<2#I9<<>bf._._a]u^]od)giGkE: +< > A vD G J 0M GU gZ ͆a h Go iv '     #    (  È و  bfғ!T'P,1< 8&+>D8IN͛SKYe]9chDmܙsvU~Ğ b?ޥî#2etrue. X = X. X /= X :- !, fail. X /= Y. X | Y :- X. X | Y :- Y. X;Y :- X. X;Y :- Y. P -> Q :- P, !, Q. P -> Q | R :- P, !, Q. P -> Q | R :- R. P -> Q ; R :- P, !, Q. P -> Q ; R :- R. (X, Y) :- X, Y. not(X) :- X, !, fail. not(X). Compterm =.. Termlist :- nonvar(Compterm), !, subuniv(Compterm,0,Termlist). Compterm =.. [F, .. Args] :- !, length(Args, Arity), functor(Compterm, F, Arity), subuniv(Compterm, 1, Args). X =.. X :- atom(X). subuniv(Compterm,Index, [Term, ..Resterms]) :- term(Index, Compterm, Term), !, Index1 is Index + 1, subuniv(Compterm, Index1, Resterms). subuniv(Compterm, Index,[]). op(X,Y,[]) :- !. op(Precedence, Type, [A, .. B]) :- !, defop(Precedence, Type, A), op(Precedence, Type, B). op(Precedence, Type, Op) :- defop(Precedence, Type, Op). op(700, fx, [trace, untrace])! trace [] :- !. trace [X, ..Y] :- !, spy X, trace Y. trace X :- spy X. untrace [] :- !. untrace [X, ..Y] :- unspy X, untrace Y. untrace X :- unspy X. name(Atom, List) :- nonvar(List), concat(List, Atom). name(Atom, List) :- atom(Atom), explode(Atom, List, 1). explode(Atom, [A, ..B], N) :- char(N, Atom, A), !, (N1 is N + 1), explode(Atom, B, N1). explode(Atom, [], _). findall(X,P,_) :- open_bag,P,write_bag(X). findall(_,_,L) :- close_bag(L). findall(_,_,_) :- free_bag, fail. subgoal_of(X) :- ancestors([Y, ..Z]), member(X,Z). clause(Head, Body) :- functor(Head, Name, Arity), definition(Name, Defn), find_clause(Head, Defn, Body). find_clause(Head, Defn, Body) :- head(Defn, Head), body(Defn, Body). find_clause(Head, Defn, Body) :- next_clause(Defn, Defn1), find_clause(Head, Defn1, Body). retract((Head :- Body)) :- !, functor(Head, Name, Arity), definition(Name, Defn), remove_clause(Head, Defn, Body). retract(Head) :- functor(Head, Name, Arity), definition(Name, Defn), remove_clause(Head, Defn, true). remove_clause(Head, Defn, Body) :- head(Defn, Head), body(Defn, Body), unlink_clause(Defn). remove_clause(Head, Defn, Body) :- match(Head, Defn, Body), !, next_clause(Defn, Defn1), remove_clause(Head, Defn1, Body). remove_clause(Head, Defn, Body) :- next_clause(Defn, Defn1), free(Defn), remove_clause(Head, Defn1, Body). match(Head, Defn, Body) :- head(Defn, Head), body(Defn, Body),!,fail. match(_,_,_). retractall(X) :- retract((X :- Y)), fail. retractall(_). :- op(700,fx,[load, unload]). unload Fname :- retract(file(Fname, Proc_list)), !, remove_all(Proc_list),!. unload Fname. remove_all([]) :- !. remove_all([A, ..B]) :- free_proc(A), remove_all(B). load Fname :- unload Fname, consult(Fname). private([]) :- !. private([A, ..B]) :- remob(A), private(B). ask(Q,A) :- prompt(Old, Q), ratom(A), prompt(_,Old). % (11/1/83)