s([s|A]) -->
    (np(B), vp(C)), {append([B], [C], A)}.
np([np|A]) -->
    (det(B), n(C)), {append([B], [C], A)}.
vp([vp|A]) -->
      v(B), {A=[B]}
    ; ((v(C), np(D)), {append([C], [D], E)}), {A=E}.
det([det|A]) -->
      [der], {A=[der]}
    ; [das], {A=[das]}.
n([n|A]) -->
      ['Programmierer'], {A=['Programmierer']}
    ; ['Programm'], {A=['Programm']}.
v([v, steht]) --> [steht].
v([v, schrieb]) --> [schrieb].
