% Aufg 6.1

:- use_module('Grammatik/kategorien.pl',[kategorie/1]).

numerus(X) :- wortformen:numerus(X).

% kategorien(+DCG-Regel,-atomare Formeln).

kategorien((L --> R), Formeln) :-
   kategorien(L,[],FormelnL),
   kategorien(R,FormelnL,Formeln).

kategorien(X,Acc,Formeln) :-
    var(X), !, Formeln = Acc.

kategorien((R1,R2),Acc,Formeln) :-
    !, kategorien(R1,Acc,AccR1),
    kategorien(R2,AccR1,Formeln).

kategorien((R1;R2),Acc,Formeln) :-
    !, kategorien(R1,Acc,AccR1),
    kategorien(R2,AccR1,Formeln).

kategorien([_Atom|_Atome],Acc,Formeln) :-
    !, Formeln = Acc.
kategorien([],Acc,Formeln) :-
    Formeln = Acc.

kategorien({_},Acc,Formeln) :-
    !, Formeln = Acc.

kategorien(C,Acc,Formeln) :-
    Formeln = [C|Acc].

% pruefe_kategorien(+DCG-Regel)

pruefe_kategorien((L --> R)) :-
    !, kategorien((L --> R),Liste),
    pruefe_kategorien(Liste).

pruefe_kategorien([]).
pruefe_kategorien([C|Cs]) :-
    % falls C eine Kategorie ist, gut; sonst Fehler melden:
    (kategorie(C) -> true
    ; format('\nFehlerhafter Kategorienausdruck: ~w',[C])
    ),
    pruefe_kategorien(Cs).
