2:- module(options,[parseOptions/2,
    3                   option/2,
    4                   setOption/3,
    5                   showOptions/1, 
    6                   setDefaultOptions/1]).    7
    8:- use_module(semlib(errors),[error/2,warning/2]).    9:- use_module(library(lists),[member/2]).   10
   11
   12/* =======================================================================
   13   Global dynamic predicates
   14========================================================================*/
   15
   16:- dynamic option/2.   17 
   18
   19/* =======================================================================
   20   Set Option
   21========================================================================*/
   22
   23setOption(P,Option,Value):-
   24   assertOptions(P,[Option:Value]).
   25
   26
   27/* =======================================================================
   28   Check User Options
   29========================================================================*/
   30
   31parseOptions(P,Arg):-
   32   opts(P,Options,Arg,[]), !,
   33   assertOptions(P,Options),
   34   dependentOptions(P).
   35
   36
   37/* =======================================================================
   38   Options Grammar
   39========================================================================*/
   40
   41opts(_,[]) --> [].
   42opts(P,[O:do|L]) --> opt0(P,O), opts(P,L). 
   43opts(P,[O:V|L]) --> opt1(P,O), value(V), opts(P,L). 
   44opts(P,[O:true|L]) --> opt1(P,O), {option(P,O,_,true,_)}, opts(P,L). 
   45opts(P,[O:V|L]) --> opt2(P,O), value(V), opts(P,L). 
   46opts(P,[O:V|L]) --> opt3(P,O), integer(V), opts(P,L). 
   47opts(P,[unknownoption:O|L]) --> opt4(P,O), opts(P,L). 
   48opts(P,[unknownoption:O|L]) --> opt4(P,O), value(_), opts(P,L). 
   49opts(P,[unknown:V|L]) --> value(V), opts(P,L). 
   50
   51opt0(P,O) --> {option(P,O,0,_,_)}, [O].
   52opt1(P,O) --> {option(P,O,1,_,_)}, [O].
   53opt2(P,O) --> {option(P,O,-1,_,_)}, [O].
   54opt3(P,O) --> {option(P,O,-2,_,_)}, [O].
   55opt4(_,O) --> [O], {atom_chars(O,['-','-'|_])}.
   56
   57value(V) --> [V], {atom_chars(V,[X,Y|_]),  \+ (X = '-', Y = '-')}.
   58value(V) --> [V], {atom_chars(V,[_])}.
   59
   60integer(V) --> [Int], {atom_codes(Int,Codes), isInteger(Codes,0,V)}.
   61
   62
   63/* =======================================================================
   64   Check for Integer
   65========================================================================*/
   66
   67isInteger([],Int,Int):- !.
   68
   69isInteger([X|L],Old,Int):-
   70   X > 47, X < 58, !,
   71   New is (Old*10)+(X-48),
   72   isInteger(L,New,Int).
   73
   74
   75/* =======================================================================
   76   Dependent Options
   77========================================================================*/
   78
   79dependentOptions(P):-
   80   findall(ifthen(A,B,C,D),dep(P,A,B,C,D),L),
   81   dependentOptions(L,P).
   82
   83dependentOptions([],_):- !.
   84
   85dependentOptions([ifthen(A,B,C,D)|L],P):-
   86   option(A,B), !, 
   87   setOption(P,C,D),
   88   dependentOptions(L,P).
   89
   90dependentOptions([_|L],P):-
   91   dependentOptions(L,P).
   92
   93
   94
   95/* =======================================================================
   96   Assert Options
   97========================================================================*/
   98
   99assertOptions(_,[]).
  100
  101assertOptions(P,[Option:do|L]):- 
  102   option(P,Option,0,_,_), !,
  103   retract(option(Option,_)),
  104   assert(option(Option,do)),
  105   assertOptions(P,L).
  106
  107assertOptions(P,[Option:Value|L]):- 
  108   option(P,Option,-1,_,_), 
  109   atomic(Value), !,
  110   retract(option(Option,_)),
  111   assert(option(Option,Value)),
  112   assertOptions(P,L).
  113
  114assertOptions(P,[Option:Value|L]):- 
  115   option(P,Option,-2,_,_), 
  116   number(Value), !,
  117   retract(option(Option,_)),
  118   assert(option(Option,Value)),
  119   assertOptions(P,L).
  120
  121assertOptions(P,[Option:Value|L]):- 
  122   atomic(Value), 
  123   option(P,Option,1,Value,_), !,
  124   retract(option(Option,_)),
  125   assert(option(Option,Value)),
  126   assertOptions(P,L).
  127
  128assertOptions(P,[unknownoption:Option|L]):- !, 
  129   error('option ~p not supported',[Option]),
  130   assertOptions(P,L).
  131
  132assertOptions(P,[unknown:Unknown|L]):- !,
  133   error('argument ~p not interpreted',[Unknown]),
  134   assertOptions(P,L).
  135
  136assertOptions(P,[Option:Value|L]):- 
  137   error('unknown value ~p for option ~p',[Value,Option]), !,
  138   assertOptions(P,L).
  139
  140
  141/* =======================================================================
  142   Default Options
  143========================================================================*/
  144
  145setDefaultOptions(P):- 
  146   retractall(option(_,_)), 
  147   setof(Op,Ar^Val^Def^option(P,Op,Ar,Val,Def),Options), 
  148   setDefaultOptions(Options,P).
  149
  150setDefaultOptions([],_):- !.
  151
  152setDefaultOptions([X|L],P):-  
  153   option(P,X,_,_,D), !,
  154   assert(option(X,D)),  
  155   setDefaultOptions(L,P).
  156
  157
  158/* =======================================================================
  159   Display Options
  160========================================================================*/
  161
  162showOptions(P):-  
  163   ( setof(O,V^D^(option(P,O,0,V,D),format(user_error,'  ~w~n',[O])),_), !; true ),
  164   ( setof(O,V^D^(option(P,O,-1,V,D),format(user_error,'  ~w <file>~n',[O])),_), !; true ), 
  165   ( setof(O,V^D^(option(P,O,-2,V,D),format(user_error,'  ~w <integer> (default: ~p)~n',[O,D])),_), !; true ),
  166   ( setof(o(O,D),V^option(P,O,1,V,D),Options), !; true ),
  167   findall(_,( member(o(O,D),Options),
  168               findall(V,option(P,O,1,V,_),L),
  169               format(user_error,'  ~w <arg> (possible values: ~w, default: ~w)~n',[O,L,D])),_), 
  170   nl(user_error).
  171
  172
  173/* =======================================================================
  174   Tokkie Options         % option(Option,NumberArgs,Value,Default)
  175========================================================================*/
  176
  177option( tokkie, '--help',       0, _, dont       ).
  178option( tokkie, '--version',    0, _, dont       ).
  179option( tokkie, '--stdin',      0, _, dont       ).
  180option( tokkie, '--warnings',   1, V, false      ):- member(V,[true,false]).
  181option( tokkie, '--language',   1, V, en         ):- member(V,[en,it]).
  182option( tokkie, '--quotes',     1, V, keep       ):- member(V,[keep,delete]).
  183option( tokkie, '--mode',       1, V, poor       ):- member(V,[poor,iob,rich]).
  184option( tokkie, '--format',     1, V, txt        ):- member(V,[prolog,txt]).
  185option( tokkie, '--input',     -1, _, user_input ).
  186option( tokkie, '--output',    -1, _, user_output).
  187
  188
  189/* =======================================================================
  190   Nutcracker Options         % option(Option,NumberArgs,Value,Default)
  191========================================================================*/
  192
  193option( nutcracker, '--help',          0, _, dont      ).
  194option( nutcracker, '--version',       0, _, dont      ).
  195option( nutcracker, '--force',         1, V, false     ):- member(V,[true,false]).
  196option( nutcracker, '--soap',          1, V, false     ):- member(V,[true,false]).
  197option( nutcracker, '--modal',         1, V, false     ):- member(V,[true,false]).
  198%option( nutcracker, '--vpe',           1, V, false     ):- member(V,[true,false]).
  199option( nutcracker, '--plural',        1, V, false     ):- member(V,[true,false]).
  200option( nutcracker, '--copula',        1, V, false     ):- member(V,[true,false]).
  201option( nutcracker, '--resolve',       1, V, true      ):- member(V,[true,false]).
  202option( nutcracker, '--nn',            1, V, false     ):- member(V,[true,false]).
  203option( nutcracker, '--x',             1, V, false     ):- member(V,[true,false]).
  204option( nutcracker, '--wordnet',       1, V, true      ):- member(V,[true,false]).
  205option( nutcracker, '--warnings',      1, V, false     ):- member(V,[true,false]).
  206option( nutcracker, '--info',          1, V, false     ):- member(V,[true,false]).
  207option( nutcracker, '--graph',         1, V, false     ):- member(V,[true,false]).
  208option( nutcracker, '--contradiction', 1, V, false     ):- member(V,[true,false]). % use theorem prover to check for contradictions
  209option( nutcracker, '--wsd',           1, V, false     ):- member(V,[true,false]).
  210option( nutcracker, '--roles',         1, V, proto     ):- member(V,[proto,verbnet]). % ,framenet]).
  211option( nutcracker, '--language',      1, V, en        ):- member(V,[en,it]).
  212option( nutcracker, '--inference',     1, V, yes       ):- member(V,[yes,no,only]).
  213option( nutcracker, '--tp',            1, V, bliksem   ):- member(V,[vampire,bliksem,otter]).
  214option( nutcracker, '--mb',            1, V, mace      ):- member(V,[mace,paradox]).
  215option( nutcracker, '--mbbis',         1, V, none      ):- member(V,[none,mace]).
  216option( nutcracker, '--domsize',      -2, _, 50        ).
  217option( nutcracker, '--timelim',      -2, _, 30        ).
  218option( nutcracker, '--dir',          -1, _, 'working' ).
  219option( nutcracker, '--axioms',       -1, _, 'none' ).
  220
  221
  222/* =======================================================================
  223   Boxer Options         % option(Option,NumberArgs,Value,Default)
  224========================================================================*/
  225
  226option( boxer, '--help',       0, _, dont       ).
  227option( boxer, '--version',    0, _, dont       ).
  228option( boxer, '--stdin',      0, _, dont       ).
  229option( boxer, '--resolve',    1, V, false      ):- member(V,[true,false]).
  230option( boxer, '--integrate',  1, V, false      ):- member(V,[true,false]).
  231option( boxer, '--warnings',   1, V, false      ):- member(V,[true,false]).
  232option( boxer, '--instantiate',1, V, false      ):- member(V,[true,false]).
  233option( boxer, '--ccg',        1, V, false      ):- member(V,[true,false]).
  234option( boxer, '--elimeq',     1, V, false      ):- member(V,[true,false]).
  235option( boxer, '--box',        1, V, false      ):- member(V,[true,false]).
  236%option( boxer, '--vpe',        1, V, false      ):- member(V,[true,false]).
  237option( boxer, '--nn',         1, V, false      ):- member(V,[true,false]).
  238option( boxer, '--tense',      1, V, false      ):- member(V,[true,false]).
  239option( boxer, '--modal',      1, V, false      ):- member(V,[true,false]).
  240option( boxer, '--plural',     1, V, false      ):- member(V,[true,false]).
  241option( boxer, '--x',          1, V, false      ):- member(V,[true,false]).
  242option( boxer, '--copula',     1, V, true       ):- member(V,[true,false]).
  243option( boxer, '--tokid',      1, V, local      ):- member(V,[local,global]).
  244option( boxer, '--mwe',        1, V, no         ):- member(V,[no,yes,all]).
  245%option( boxer, '--presup',     1, V, max        ):- member(V,[min,max]).
  246option( boxer, '--theory',     1, V, drt        ):- member(V,[drt,sdrt]).
  247option( boxer, '--roles',      1, V, proto      ):- member(V,[proto,verbnet]).  % ,framenet]).
  248option( boxer, '--format',     1, V, prolog     ):- member(V,[prolog,xml,latex,dot,no]).
  249option( boxer, '--semantics',  1, V, drs        ):- member(V,[drs,pdrs,fol,drg,amr,tacitus,der]).
  250option( boxer, '--input',     -1, _, user_input ).
  251option( boxer, '--output',    -1, _, user_output).
  252
  253
  254/* =======================================================================
  255   Dependent Options         % if O1:V1 then set O2:V2
  256========================================================================*/
  257
  258dep(boxer, '--semantics',amr, '--elimeq',true). 
  259dep(boxer, '--semantics',amr, '--copula',false). 
  260dep(boxer, '--semantics',amr, '--modal',true). 
  261dep(boxer, '--semantics',amr, '--theory',sdrt)