% Maptask templates
% Torbjörn Lager and Natalia Zinovjeva, 1999
% Note that we look at the current and preceding context only...

da:A>B <- u_mem:W@[0].
da:A>B <- u_first:W@[0].
da:A>B <- u_last:W@[0].
da:A>B <- u_bigram:W@[0].

da:A>B <- da:C@[-1].
da:A>B <- da:C@[-1,-2].
da:A>B <- da:C@[-1] & da:D@[-2].

da:A>B <- da:C@[-1] & u_mem:W@[0].

da:A>B <- s:C@[0].
da:A>B <- s:C@[0] & u_mem:W@[0].
da:A>B <- s:C@[0] & u_bigram:W@[0].
da:A>B <- s:C@[0] & da:D@[-1].

da:A>B <- s_change:C@[0] & u_mem:W@[0].
da:A>B <- s_change:C@[0] & da:D@[-1].

da:A>B <- u_length:C@[0] & u_mem:W@[0].
da:A>B <- u_length:C@[0] & da:D@[-1].


% Auxiliary predicates

:- use_module(library(lists)).

u_mem(P,W) :-
    u(P,Ws),
    member(W,Ws).
    
u_first(P,W) :-
    u(P,[W|_]).

u_last(P,W) :-
    u(P,Ws),
    last(Ws,W).

u_bigram(P,(Wi,Wj)) :-
    u(P,Ws),
    nextto(Wi,Wj,Ws).

s_change(P,V) :-
    (   s(P,A),
        P1 is P-1,
        s(P1,A)
    ->  V = false
    ;   V = true
    ).
    
u_length(P,Length) :-
    u(P,Ws),
    length(Ws,N),
    (   N == 1
    ->  Length = '1'
    ;   N == 2
    ->  Length = '2'
    ;   N == 3
    ->  Length = '3'
    ;   N > 3,
        N =< 10
    ->  Length = '>3'
    ;   Length = '>10'
    ).