% File: ECMI01.AI2_BABYELIZA % Author: Peter Ross % Purpose: the beginnings of an 'Eliza'-like program % Needs: UTIL for member/2 and append/3 % ECMI01.AI2_SENTENCE for sentence/1 % Top level is go/0. go :- sentence(Input), process(Input). process(Input) :- (member(bye, Input) ; member(goodbye, Input)), !, write('I enjoyed our little chat.'), nl. process(Input) :- pair(InputPattern,OutputPattern), match(InputPattern, Input), flatten(OutputPattern, Output), speak(Output), nl, go. pair([i,hate,X],[do, you, really, hate, X, ?]). pair([X,you,Y,me, ?], [why, do, you, ask, if, i, Y, you, ?]). pair([i,like,X], [does, anyone, else, in, your, family, like, X, ?]). pair([are, you, X, ?], [what, makes, you, think, i, am, X, ?]). pair([you, are, X], [does, it, please, you, to, believe, i, am, X, ?]). pair([X], [please, go, on, '.']). match([], []). match([Head|Tail], [First|Rest]) :- nonvar(Head), !, Head = First, match(Tail, Rest). match([Head|Tail], [First|Rest]) :- match(Tail, Rest), !, Head = [First]. match([Head|Tail], [First|Rest]) :- match([Var|Tail], Rest), Head = [First|Var]. flatten([], []). flatten([First|Rest], [First|RestOfAnswer]) :- atom(First), flatten(Rest, RestOfAnswer). flatten([First|Rest], Answer) :- flatten(First,FlatFirst), flatten(Rest,FlatRest), append(FlatFirst, FlatRest, Answer). speak([]) :- !. speak([X, Y]) :- member(Y,[?,'.', !]), !, write(X), write(Y), nl. speak([FirstWord|Rest]) :- write(FirstWord), tab(1), speak(Rest).