% filename: sam.pl
% simple form of Shanks SAM program
% on conceptual dependancy
% will paraphrase story based on football match script
% the script is for attending a sport event

:-[library(lists)].   % need member

sam(Story,Script) :-
    find(Story,Script,Defaults),
    match(Script,Story),
    override_defaults(Defaults).

find(Story,Script,Defaults) :-
    filler(Slot,Story),nonvar(Slot),
    trigger(Slot,Name),
    script(Name,Script,Defaults).

% Story is a just a subsequence of Script

match(Script,[]).
match([Line|Script],[Line|Lines]) :-
    match(Script,Lines).
match([_|Script],Story) :-
    match(Script,Story).

% Slot is a word in the story

filler(Slot,Story) :-
    member(Action,Story),
    Action =.. [_|Args],
    member(Slot,Args).

% override default names by real names if present

override_defaults([]).
override_defaults([(N,N)|L]) :-  % unify with default if variable
   override_defaults(L).
override_defaults([(N1,N2)|L]) :-
    nonvar(N1),override_defaults(L).

% some sports match scripts


trigger(vetch,sport).
trigger(st_helens,sport).

% sport script

script(sport,
    [ptrans(Actor,Actor2,EarlierPlace,Ground),
     atrans(Actor,Money,Actor,Cashier),
     ptrans(Actor,Actor,Turnstyle,Stand),
     mtrans(Actor,Game,Actor),
     ptrans(Actor,Actor2,Ground,ElseWhere)],
    [(Actor,fan),(Actor2,fan2),
     (EarlierPlace,place1),
     (Ground,ground), (Turnstyle,turnstyle),
     (Stand,stand),(Game,game),
     (Cashier,cashier), 
     (Money,cash),(ElseWhere,place2)] ).


