% This code is automatically generated on the basis of a file in Codeco notation. % % For more information, see the package ch.uzh.ifi.attempto.codeco of the AceWiki system % (http://attempto.ifi.uzh.ch/acewiki/) and the thesis "Controlled English for Knowledge % Representation" (http://attempto.ifi.uzh.ch/site/pubs/papers/doctoral_thesis_kuhn.pdf). /* === ACE Editor Grammar === */ /* - Tobias Kuhn, 26 November 2010 - */ /* Below, the grammar rules of the ACE Editor grammar are shown: */ /* --- Texts and Sentences --- */ /* 'text' stands for a complete text consisting of an arbitrary number of complete sentences (including zero): */ text([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(text, []), A1/A1)-->[]. text([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(text, (A1, B1)), C1/D1)-->complete_sentence([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/E2), text([F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3, D3, E3], B1, E2/D1). /* A complete sentence is represented by the category 'complete_sentence' and is either a declarative sentence that ends with a full stop or a question ending with a question mark: */ complete_sentence([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(complete_sentence, (A1, ['.'])), B1/C1)-->sentence([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], A1, B1/C1), ['.']. complete_sentence([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(complete_sentence, (//, A1, [?])), B1/C1)-->[D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2]// (B1/D2), simple_sentence_2([plus, minus, plus, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3], A1, D2/B3), [?], ~(B1/B3/C1). /* General sentences are represented by 'sentence': */ sentence([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(sentence, A1), B1/C1)-->sentence_coord_1([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], A1, B1/C1). sentence([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(sentence, (//, ['for every'], A1, B1)), C1/D1)-->[E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2]// (C1/E2), ['for every'], nc([minus, F2, G2, minus, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3], A1, E2/D3), sentence_coord_1([E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3, X3, Y3, Z3, A4, B4, C4, D4], B1, D3/E4), ~(C1/E4/D1). sentence([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(sentence, (//, [if], A1, [then], B1)), C1/D1)-->[E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2]// (C1/E2), [if], sentence_coord_1([F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3, D3, E3], A1, E2/F3), [then], sentence_coord_1([G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3, X3, Y3, Z3, A4, B4, C4, D4, E4, F4], B1, F3/G4), ~(C1/G4/D1). /* Sentences can be coordinated using "or" ('sentence_coord_1') and "and" ('sentence_coord_2'): */ sentence_coord_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(sentence_coord_1, A1), B1/C1)-->sentence_coord_2([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], A1, B1/C1). sentence_coord_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(sentence_coord_1, (//, A1, [or], B1)), C1/D1)-->[E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2]// (C1/E2), sentence_coord_2([F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3, D3, E3], A1, E2/F3), [or], sentence_coord_1([G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3, X3, Y3, Z3, A4, B4, C4, D4, E4, F4], B1, F3/G4), ~(C1/G4/D1). sentence_coord_2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(sentence_coord_2, A1), B1/C1)-->simple_sentence_1([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], A1, B1/C1). sentence_coord_2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(sentence_coord_2, (A1, [and], B1)), C1/D1)-->simple_sentence_1([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/E2), [and], sentence_coord_2([F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3, D3, E3], B1, E2/D1). /* Uncoordinated sentences are represented in two levels by 'simple_sentence_1' and 'simple_sentence_2': */ simple_sentence_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(simple_sentence_1, (//, ['it is false that'], A1)), B1/C1)-->[D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2]// (B1/D2), ['it is false that'], simple_sentence_2([minus, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3], A1, D2/D3), ~(B1/D3/C1). simple_sentence_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(simple_sentence_1, (['there is'], A1)), B1/C1)-->['there is'], np([minus, D1, E1, minus, plus, minus, minus, nom, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1], A1, B1/C1). simple_sentence_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(simple_sentence_1, (['there is'], A1, ['such that'], B1)), C1/D1)-->['there is'], np([minus, E1, F1, minus, plus, minus, minus, nom, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], A1, C1/Y1), ['such that'], simple_sentence_1([Z1, A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2], B1, Y1/D1). simple_sentence_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(simple_sentence_1, (['there are'], A1)), B1/C1)-->['there are'], np([minus, D1, E1, minus, plus, minus, plus, nom, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1], A1, B1/C1). simple_sentence_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(simple_sentence_1, A1), B1/C1)-->simple_sentence_2([minus, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/C1). simple_sentence_2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(simple_sentence_2(qu:A, whin:B, whout:C), (A1, B1)), C1/D1)-->np([A, B, E1, minus, F1, G1, H1, nom, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1], A1, C1/A2), vp_coord_1([A, E1, C, I1, B2, C2, H1, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, A2/W2), ~(C1/W2/D1). /* --- Verb Phrases --- */ /* Like sentences, verb phrases can be coordinated using "or" ('vp_coord_1') and "and" ('vp_coord_2'): */ vp_coord_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(vp_coord_1(subj:D, pl:G, qu:A, whin:B, whout:C), A1), B1/C1)-->vp_coord_2([A, B, C, D, D1, E1, G, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], A1, B1/C1). vp_coord_1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(vp_coord_1(subj:D, pl:G, qu:A, whin:B, whout:C), (//, A1, [or], B1)), C1/D1)-->[E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2]// (C1/E2), vp_coord_2([A, B, F2, D, G2, H2, G, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3], A1, E2/B3), [or], vp_coord_1([A, F2, C, D, C3, D3, G, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3], B1, B3/X3), ~(C1/X3/D1). vp_coord_2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(vp_coord_2(subj:D, pl:G, qu:A, whin:B, whout:C), A1), B1/C1)-->vp([A, B, C, D, D1, E1, G, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], A1, B1/C1). vp_coord_2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(vp_coord_2(subj:D, pl:G, qu:A, whin:B, whout:C), (A1, [and], B1)), C1/D1)-->vp([A, B, E1, D, F1, G1, G, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1], A1, C1/A2), [and], vp_coord_2([A, E1, C, D, B2, C2, G, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, A2/D1). /* Uncoordinated verb phrases represented by 'vp' can use an auxiliary verb and can have verb phrase modifiers: */ vp([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(vp(subj:D, exist:E, rel:J, pl:G, qu:A, whin:B, whout:C), (A1, B1, C1)), D1/E1)-->aux([F1, G1, H1, I1, E, J1, G, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], A1, D1/D2), v([A, B, E2, D, E, F2, G, G2, H2, J, N1, inf, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, D2/W2), vmod([A, E2, C, D, X2, Y2, Z2, A3, B3, C3, D3, E3, I2, J2, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3], C1, W2/R3), ~(D1/R3/E1). vp([A, B, C, D, plus, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(vp(subj:D, exist:plus, rel:I, pl:F, qu:A, whin:B, whout:C), (Z, A1)), B1/C1)-->v([A, B, D1, D, plus, E1, F, F1, G1, I, minus, fin, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1], Z, B1/V1), vmod([A, D1, C, D, W1, X1, Y1, Z1, A2, B2, C2, D2, H1, I1, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2], A1, V1/Q2), ~(B1/Q2/C1). /* The category 'v' represents the main verb or - if "be" is used as a copula verb - the complementing noun phrase or adjective complement: */ v([A, B, B, C, D, E, F, G, H, I, minus, J, K, minus, L, M, N, O, P, Q, R, S, T, U, V, W], =>(v(be:minus, pl:F, vform:J, copula:minus, whin:B, whout:B), X), Y/Z)-->verb([A1, B1, C1, D1, E1, F1, F, G1, H1, I1, minus, J, J1, K1, itr, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1], X, Y/Z). v([A, B, C, D, E, F, G, H, I, J, minus, K, L, minus, M, N, O, P, Q, R, S, T, U, V, W, X], =>(v(subj:D, be:minus, rel:J, pl:G, vform:K, embv:L, copula:minus, qu:A, whin:B, whout:C), (Y, Z)), A1/B1)-->verb([C1, D1, E1, F1, G1, H1, G, I1, J1, K1, minus, K, L1, M1, tr, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], Y, A1/Y1), np([A, B, C, D, Z1, A2, B2, acc, C2, J, D2, E2, L, F2, tr, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2], Z, Y1/B1). v([A, B, C, D, E, F, G, H, I, J, plus, K, L, minus, M, N, O, P, Q, R, S, T, U, V, W, X], =>(v(subj:D, be:plus, rel:J, embv:L, copula:minus, qu:A, whin:B, whout:C), (Y, [by], Z)), A1/B1)-->verb([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, plus, M1, N1, O1, tr, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1], Y, A1/A2), [by], np([A, B, C, D, B2, C2, D2, acc, E2, J, F2, G2, L, minus, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2], Z, A2/B1). v([A, B, C, D, E, F, G, H, I, J, plus, K, L, plus, M, N, O, P, Q, R, S, T, U, V, W, X], =>(v(subj:D, be:plus, rel:J, embv:L, copula:plus, qu:A, whin:B, whout:C), Y), Z/A1)-->np([A, B, C, D, B1, C1, minus, acc, D1, J, E1, F1, L, plus, G1, plus, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1], Y, Z/A1). v([A, B, C, D, E, F, minus, G, H, I, plus, J, K, plus, L, M, N, O, P, Q, R, S, T, U, V, W], =>(v(subj:D, be:plus, rel:I, pl:minus, embv:K, copula:plus, qu:A, whin:B, whout:C), X), Y/Z)-->np([A, B, C, D, A1, B1, minus, acc, C1, I, D1, E1, K, plus, F1, minus, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1], X, Y/Z). v([A, B, B, C, D, E, F, G, H, I, plus, J, K, plus, L, M, N, O, P, Q, R, S, T, U, V, W], =>(v(be:plus, copula:plus, whin:B, whout:B), X), Y/Z)-->adj_coord([A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1], X, Y/Z). v([A, B, C, D, E, F, G, H, I, J, plus, K, L, plus, M, N, O, P, Q, R, S, T, U, V, W, X], =>(v(subj:D, be:plus, rel:J, embv:L, copula:plus, qu:A, whin:B, whout:C), Y), Z/A1)-->adjc([A, B, C, D, B1, C1, D1, E1, F1, J, G1, H1, L, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1], Y, Z/A1). /* --- Noun Phrases --- */ /* Noun phrases are represented by 'np' and can consist of proper names, variables, pronouns, and different noun constructs: */ np([A, B, C, D, plus, plus, minus, E, F, G, H, I, J, K, L, minus, M, N, O, P, Q, R, S, T, U, V], =>(np(id:F, exist:plus, rel:G, of:minus, def:plus, pl:minus, embv:J, qu:A, whin:B, whout:C), (W, >>(id:F, human:X, gender:Y, type:prop, hasvar:minus), Z)), A1/B1)-->prop([C1, D1, E1, F1, G1, H1, I1, J1, F, K1, L1, M1, N1, O1, P1, Q1, X, Y, R1, S1, T1, U1, V1, W1, X1, Y1], W, A1/Z1), [A2, B2, C2, D2, E2, F2, G2, H2, F, I2, J2, K2, L2, M2, N2, O2, X, Y, prop, minus, P2, Q2, R2, S2, T2, U2]>> (Z1/V2), relcl([A, B, C, F, W2, X2, Y2, Z2, A3, G, B3, C3, J, D3, E3, F3, X, G3, H3, I3, J3, K3, L3, M3, N3, O3], Z, V2/B1). np([A, B, B, C, plus, plus, minus, D, E, F, G, H, I, J, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:E, exist:plus, of:minus, def:plus, pl:minus, whin:B, whout:B), (#(E), V, >(id:E, type:var, hasvar:plus, var:W))), X/Y)--> #(E), newvar([Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, W, T1, U1, V1, W1, X1], V, X/Y1), [Z1, A2, B2, C2, D2, E2, F2, G2, E, H2, I2, J2, K2, L2, M2, N2, O2, P2, var, plus, W, Q2, R2, S2, T2, U2]>Y1/Y. np([A, B, B, C, plus, plus, minus, D, E, F, G, H, I, J, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:E, exist:plus, of:minus, def:plus, pl:minus, whin:B, whout:B), (V, W, <(id:E, type:noun, hasvar:plus, noun:X, var:Y, human:Z, gender:A1), >(id:E, human:Z, gender:A1, type:ref, hasvar:minus))), B1/C1)--> $def_noun_sg([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, X, Y1, Z1, A2, B2], V, B1/B1), $ref([C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y, Y2, Z2, A3], W, B1/B1), [+[B3, C3, D3, E3, F3, G3, H3, I3, E, J3, K3, L3, M3, N3, O3, P3, Z, A1, noun, plus, Y, X, Q3, R3, S3, T3]]U3/C1. np([A, B, B, C, plus, plus, minus, D, E, F, G, H, I, J, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:E, exist:plus, of:minus, def:plus, pl:minus, whin:B, whout:B), (V, <(id:E, type:noun, noun:W, human:X, gender:Y), >(id:E, human:X, gender:Y, type:ref, hasvar:minus))), Z/A1)--> $def_noun_sg([B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W, W1, X1, Y1, Z1], V, Z/Z), [+[A2, B2, C2, D2, E2, F2, G2, H2, E, I2, J2, K2, L2, M2, N2, O2, X, Y, noun, P2, Q2, W, R2, S2, T2, U2]]V2/A1. np([A, B, B, C, plus, plus, minus, D, E, F, G, H, I, J, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:E, exist:plus, of:minus, def:plus, pl:minus, whin:B, whout:B), (V, <(id:E, hasvar:plus, var:W, human:X, gender:Y), >(id:E, human:X, gender:Y, type:ref, hasvar:minus))), Z/A1)--> $ref([B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, W, X1, Y1, Z1], V, Z/Z), [+[A2, B2, C2, D2, E2, F2, G2, H2, E, I2, J2, K2, L2, M2, N2, O2, X, Y, P2, plus, W, Q2, R2, S2, T2, U2]]V2/A1. np([A, B, B, C, plus, plus, minus, D, C, E, F, G, H, I, J, minus, K, L, M, N, O, P, Q, plus, R, S], =>(np(id:C, subj:C, exist:plus, of:minus, def:plus, pl:minus, refl:plus, whin:B, whout:B), (T, <(id:C, human:U, gender:V))), W/X)--> $pron([Y, Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, U, V, O1, P1, Q1, R1, S1, plus, T1, U1], T, W/W), [+[V1, W1, X1, Y1, Z1, A2, B2, C2, C, D2, E2, F2, G2, H2, I2, J2, U, V, K2, L2, M2, N2, O2, P2, Q2, R2]](np(id:E, subj:C, exist:plus, of:minus, def:plus, pl:minus, refl:minus, case:D, whin:B, whout:B), (U, +(id:E, human:V, gender:W)< - (id:C), >(id:E, human:V, gender:W, type:pron, hasvar:minus))), X/Y)--> $pron([Z, A1, B1, C1, D1, E1, F1, D, G1, H1, I1, J1, K1, L1, M1, N1, V, W, O1, P1, Q1, R1, S1, minus, T1, U1], U, X/X), [+[V1, W1, X1, Y1, Z1, A2, B2, C2, E, D2, E2, F2, G2, H2, I2, J2, V, W, K2, L2, M2, N2, O2, P2, Q2, R2], -[S2, T2, U2, V2, W2, X2, Y2, Z2, C, A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3]]R3/Y. np([A, B, C, D, E, F, minus, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(np(id:H, subj:D, exist:E, rel:I, of:O, pl:minus, embv:L, qu:A, whin:B, whout:C), (Z, A1)), B1/C1)-->quant([D1, E1, F1, G1, E, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], Z, B1/C2), nc([A, B, C, D, D2, E2, F2, G2, H, I, H2, I2, L, J2, K2, O, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2], A1, C2/C1). np([A, B, C, D, E, F, minus, G, H, I, J, K, L, M, N, minus, O, P, Q, R, S, T, U, V, W, X], =>(np(id:H, exist:E, rel:I, of:minus, pl:minus, embv:L, qu:A, whin:B, whout:C), (#(H), Y, Z, >(id:H, human:A1, type:ipron, hasvar:B1, var:C1), D1)), E1/F1)--> #(H), ipron([G1, H1, I1, J1, E, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, A1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], Y, E1/E2), opt_newvar([F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, B1, C1, Y2, Z2, A3, B3, C3], Z, E2/D3), [E3, F3, G3, H3, I3, J3, K3, L3, H, M3, N3, O3, P3, Q3, R3, S3, A1, T3, ipron, B1, C1, U3, V3, W3, X3, Y3]>D3/Z3, relcl([A, B, C, H, A4, B4, C4, D4, E4, I, F4, G4, L, H4, I4, J4, A1, K4, L4, M4, N4, O4, P4, Q4, R4, S4], D1, Z3/F1). np([A, B, B, C, plus, D, plus, E, F, G, H, I, J, minus, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:F, exist:plus, of:minus, pl:plus, copula:minus, whin:B, whout:B), (V, W, X, #(F), Y)), Z/A1)-->num_quant([B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2], V, Z/B2), $num([C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3], W, B2/B2), opt_adj_coord([C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3, X3, Y3, Z3, A4, B4], X, B2/A1), #(F), $noun_pl([C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, M4, N4, O4, P4, Q4, R4, S4, T4, U4, V4, W4, X4, Y4, Z4, A5, B5], Y, A1/A1). np([A, B, B, C, plus, D, minus, E, F, G, H, I, J, minus, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:F, exist:plus, of:minus, pl:minus, copula:minus, whin:B, whout:B), (V, ['1'], #(F), W, X, >(id:F, human:Y, gender:Z, type:noun, hasvar:minus, noun:A1))), B1/C1)-->num_quant([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], V, B1/D2), ['1'], #(F), opt_adj_coord([E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3, D3], W, D2/E3), $noun_sg([F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, Y, Z, V3, W3, X3, Y3, A1, Z3, A4, B4], X, E3/E3), [C4, D4, E4, F4, G4, H4, I4, J4, F, K4, L4, M4, N4, O4, P4, Q4, Y, Z, noun, minus, R4, A1, S4, T4, U4, V4]>E3/C1. np([plus, A, plus, B, plus, C, minus, D, E, F, G, H, I, J, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:E, exist:plus, of:minus, pl:minus, qu:plus, whout:plus), (#(E), [what], >(id:E, human:minus, type:wh, hasvar:minus))), V/W)--> #(E), [what], [X, Y, Z, A1, B1, C1, D1, E1, E, F1, G1, H1, I1, J1, K1, L1, minus, M1, wh, minus, N1, O1, P1, Q1, R1, S1]>V/W. np([plus, A, plus, B, plus, C, minus, D, E, F, G, H, I, J, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:E, exist:plus, of:minus, pl:minus, qu:plus, whout:plus), (#(E), [who], >(id:E, human:plus, type:wh, hasvar:minus))), V/W)--> #(E), [who], [X, Y, Z, A1, B1, C1, D1, E1, E, F1, G1, H1, I1, J1, K1, L1, plus, M1, wh, minus, N1, O1, P1, Q1, R1, S1]>V/W. np([plus, A, plus, B, plus, C, minus, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V], =>(np(id:E, subj:B, exist:plus, rel:F, of:L, embv:I, pl:minus, qu:plus, whout:plus), ([which], W)), X/Y)-->[which], nc([plus, plus, plus, B, Z, A1, B1, C1, E, F, D1, E1, I, F1, G1, L, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1], W, X/Y). np([plus, A, plus, B, plus, C, plus, D, E, F, G, H, I, J, K, minus, L, M, N, O, P, Q, R, S, T, U], =>(np(id:E, exist:plus, of:minus, pl:plus, qu:plus, whout:plus), ([which], V, #(E), W)), X/Y)-->[which], opt_adj_coord([Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1], V, X/Y), #(E), $noun_pl([Z1, A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2], W, Y/Y). /* The category 'nc' represents nouns optionally followed by variables, relative clauses, and prepositional phrases using "of": */ nc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, minus, P, Q, R, S, T, U, V, W, X, Y], =>(nc(id:I, rel:J, of:minus, embv:M, qu:A, whin:B, whout:C), (Z, A1, >(id:I, human:B1, gender:C1, type:noun, hasvar:D1, noun:E1, var:F1), G1)), H1/I1)-->n([J1, K1, L1, M1, N1, O1, P1, Q1, I, R1, S1, T1, U1, V1, W1, X1, B1, C1, Y1, Z1, A2, B2, E1, C2, D2, E2], Z, H1/F2), opt_newvar([G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, D1, F1, Z2, A3, B3, C3, D3], A1, F2/E3), [F3, G3, H3, I3, J3, K3, L3, M3, I, N3, O3, P3, Q3, R3, S3, T3, B1, C1, noun, D1, F1, E1, U3, V3, W3, X3]>E3/Y3, relcl([A, B, C, I, Z3, A4, B4, C4, D4, J, E4, F4, M, G4, H4, I4, B1, J4, K4, L4, M4, N4, O4, P4, Q4, R4], G1, Y3/I1). nc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, plus, P, Q, R, S, T, U, V, W, X, Y], =>(nc(id:I, subj:D, rel:J, of:plus, embv:M, qu:A, whin:B, whout:C), (Z, >(id:I, human:A1, gender:B1, type:noun, hasvar:minus, noun:C1), [of], D1)), E1/F1)-->n([G1, H1, I1, J1, K1, L1, M1, N1, I, O1, P1, Q1, R1, S1, T1, U1, A1, B1, V1, W1, X1, Y1, C1, Z1, A2, B2], Z, E1/C2), [D2, E2, F2, G2, H2, I2, J2, K2, I, L2, M2, N2, O2, P2, Q2, R2, A1, B1, noun, minus, S2, C1, T2, U2, V2, W2]>C2/X2, [of], np([A, B, C, D, Y2, Z2, A3, acc, B3, J, C3, D3, M, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3], D1, X2/R3), ~(E1/R3/F1). /* The category 'n' stands for nouns that are preceded by an optional adjective coordination: */ n([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(n(id:I, human:Q, gender:R, text:W), (A1, #(I), B1)), C1/D1)-->opt_adj_coord([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/D1), #(I), $noun_sg([E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, Q, R, U2, V2, W2, X2, W, Y2, Z2, A3], B1, D1/D1). /* New variables, optional and mandatory, are represented by 'opt_newvar' and 'newvar', respectively: */ opt_newvar([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, minus, T, U, V, W, X, Y], =>(opt_newvar(hasvar:minus), []), Z/Z)-->[]. opt_newvar([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, plus, T, U, V, W, X, Y], =>(opt_newvar(hasvar:plus, var:T), Z), A1/B1)-->newvar([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, T, W1, X1, Y1, Z1, A2], Z, A1/B1). newvar([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(newvar(var:U), (A1, /<(hasvar:plus, var:U))), B1/C1)--> $var([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, U, Z1, A2, B2], A1, B1/B1), /<([C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, plus, U, V2, W2, X2, Y2, Z2], B1/C1). /* Proper names can either require the definite article "the" or not, and are represented by the category 'prop': */ prop([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(prop(id:I, human:Q, gender:R), A1), B1/B1)--> $prop_sg([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, Q, R, S1, T1, U1, V1, I, W1, X1, Y1], A1, B1/B1). prop([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(prop(id:I, human:Q, gender:R), A1), B1/B1)--> $propdef_sg([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, Q, R, S1, T1, U1, V1, I, W1, X1, Y1], A1, B1/B1). /* --- Adjectives --- */ /* Adjectives can be only coordinated by "and", and are represented by 'opt_adj_coord' for the optional case and by 'adj_coord' if mandatory: */ opt_adj_coord([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(opt_adj_coord, []), A1/A1)-->[]. opt_adj_coord([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(opt_adj_coord, A1), B1/C1)-->adj_coord([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], A1, B1/C1). adj_coord([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adj_coord, A1), B1/C1)-->adj([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], A1, B1/C1). adj_coord([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adj_coord, (A1, [and], B1)), C1/D1)-->adj([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/E2), [and], adj_coord([F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3, D3, E3], B1, E2/D1). /* Uncoordinated adjectives are represented by 'adj' and can be used in positive, comparative and superlative forms: */ adj([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adj, A1), B1/B1)--> $adj_itr([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adj([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adj, ([more], A1)), B1/B1)-->[more], $adj_itr([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adj([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adj, A1), B1/B1)--> $adj_itr_comp([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adj([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adj, ([most], A1)), B1/B1)-->[most], $adj_itr([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adj([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adj, A1), B1/B1)--> $adj_itr_sup([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). /* The category 'adjc' stands for more complicated adjective constructions including nested noun phrases that represent a comparison object: */ adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([as], A1, [as], B1)), C1/D1)-->[as], $adj_itr([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/C1), [as], np([A, B, C, D, E2, F2, G2, acc, H2, J, I2, J2, M, minus, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, C1/D1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), (A1, [than], B1)), C1/D1)--> $adj_itr_comp([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/C1), [than], np([A, B, C, D, E2, F2, G2, acc, H2, J, I2, J2, M, minus, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, C1/D1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([more], A1, [than], B1)), C1/D1)-->[more], $adj_itr([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/C1), [than], np([A, B, C, D, E2, F2, G2, acc, H2, J, I2, J2, M, minus, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, C1/D1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), (A1, B1)), C1/D1)--> $adj_tr([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/C1), np([A, B, C, D, E2, F2, G2, acc, H2, J, I2, J2, M, minus, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, C1/D1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([more], A1, B1)), C1/D1)-->[more], $adj_tr([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/C1), np([A, B, C, D, E2, F2, G2, acc, H2, J, I2, J2, M, minus, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, C1/D1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([most], A1, B1)), C1/D1)-->[most], $adj_tr([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/C1), np([A, B, C, D, E2, F2, G2, acc, H2, J, I2, J2, M, minus, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2], B1, C1/D1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([as], A1, B1, [as], C1)), D1/E1)-->[as], $adj_tr([F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2], A1, D1/D1), np([A, B, F2, D, G2, H2, I2, acc, J2, minus, K2, L2, M, minus, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2], B1, D1/Y2), [as], np([A, F2, C, D, Z2, A3, B3, acc, C3, J, D3, E3, M, minus, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3], C1, Y2/E1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([as], A1, B1, [as], C1, D1)), E1/F1)-->[as], $adj_tr([G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2, F2], A1, E1/E1), np([A, B, G2, D, H2, I2, J2, acc, K2, minus, L2, M2, M, minus, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2], B1, E1/Z2), [as], $adj_prep([A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3, X3, E2, Y3], C1, Z2/Z2), np([A, G2, C, D, Z3, A4, B4, acc, C4, J, D4, E4, M, minus, F4, G4, H4, I4, J4, K4, L4, M4, N4, O4, P4, Q4], D1, Z2/F1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([more], A1, B1, [than], C1)), D1/E1)-->[more], $adj_tr([F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2], A1, D1/D1), np([A, B, F2, D, G2, H2, I2, acc, J2, minus, K2, L2, M, minus, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2], B1, D1/Y2), [than], np([A, F2, C, D, Z2, A3, B3, acc, C3, J, D3, E3, M, minus, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3], C1, Y2/E1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), (A1, B1, [than], C1)), D1/E1)--> $adj_tr_comp([F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2], A1, D1/D1), np([A, B, F2, D, G2, H2, I2, acc, J2, minus, K2, L2, M, minus, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2], B1, D1/Y2), [than], np([A, F2, C, D, Z2, A3, B3, acc, C3, J, D3, E3, M, minus, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3], C1, Y2/E1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), ([more], A1, B1, [than], C1, D1)), E1/F1)-->[more], $adj_tr([G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2, F2], A1, E1/E1), np([A, B, G2, D, H2, I2, J2, acc, K2, minus, L2, M2, M, minus, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2], B1, E1/Z2), [than], $adj_prep([A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3, X3, E2, Y3], C1, Z2/Z2), np([A, G2, C, D, Z3, A4, B4, acc, C4, J, D4, E4, M, minus, F4, G4, H4, I4, J4, K4, L4, M4, N4, O4, P4, Q4], D1, Z2/F1). adjc([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adjc(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), (A1, B1, [than], C1, D1)), E1/F1)--> $adj_tr_comp([G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2, F2], A1, E1/E1), np([A, B, G2, D, H2, I2, J2, acc, K2, minus, L2, M2, M, minus, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2], B1, E1/Z2), [than], $adj_prep([A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3, V3, W3, X3, E2, Y3], C1, Z2/Z2), np([A, G2, C, D, Z3, A4, B4, acc, C4, J, D4, E4, M, minus, F4, G4, H4, I4, J4, K4, L4, M4, N4, O4, P4, Q4], D1, Z2/F1). /* --- Relative Clauses --- */ /* Relative clauses are represented by 'relcl'. They start with a relative pronoun and are always optional: */ relcl([A, B, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(relcl(whin:B, whout:B), []), Z/Z)-->[]. relcl([A, B, C, D, E, F, G, H, I, plus, J, K, plus, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(relcl(subj:D, rel:plus, embv:plus, human:O, qu:A, whin:B, whout:C), (Y, Z)), A1/B1)-->relpron([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, O, S1, T1, U1, V1, W1, X1, Y1, Z1, A2], Y, A1/B2), relcl1([A, B, C, D, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O, O2, P2, Q2, R2, S2, T2, U2, V2, A2], Z, B2/B1). /* Like sentences and verb phrases, relative clauses can be coordinated by "or" ('relcl1') and "and" ('relcl2'): */ relcl1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(relcl1(subj:D, human:Q, relpron:Z, qu:A, whin:B, whout:C), (//, A1, B1, C1)), D1/E1)-->[F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2]// (D1/F2), relcl2([A, B, G2, D, H2, I2, J2, K2, L2, minus, M2, N2, O2, P2, Q2, R2, Q, S2, T2, U2, V2, W2, X2, Y2, Z2, Z], A1, F2/A3), or_relpron([B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3, P3, Q3, Q, R3, S3, T3, U3, V3, W3, X3, Y3, Z], B1, A3/Z3), relcl1([A, G2, C, D, A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, Q, M4, N4, O4, P4, Q4, R4, S4, T4, Z], C1, Z3/U4), ~(D1/U4/E1). relcl1([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(relcl1(subj:D, human:Q, relpron:Z, qu:A, whin:B, whout:C), A1), B1/C1)-->relcl2([A, B, C, D, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, Q, P1, Q1, R1, S1, T1, U1, V1, W1, Z], A1, B1/C1). relcl2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(relcl2(subj:D, rel:J, relpron:Z, human:Q, qu:A, whin:B, whout:C), (A1, B1, C1)), D1/E1)-->vp([A, B, F1, D, G1, H1, minus, I1, J1, minus, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1], A1, D1/A2), and_relpron([B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, Q, R2, S2, T2, U2, V2, W2, X2, Y2, Z], B1, A2/Z2), relcl2([A, F1, C, D, A3, B3, C3, D3, E3, J, F3, G3, H3, I3, J3, K3, Q, L3, M3, N3, O3, P3, Q3, R3, S3, Z], C1, Z2/E1). relcl2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(relcl2(subj:D, rel:J, qu:A, whin:B, whout:C), A1), B1/C1)-->vp([A, B, C, D, D1, E1, minus, F1, G1, J, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1], A1, B1/C1). relcl2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(relcl2(subj:D, rel:J, qu:A, whin:B, whout:C), (A1, B1, C1, D1)), E1/F1)-->np([A, B, G1, D, H1, I1, J1, nom, K1, minus, L1, M1, N1, minus, O1, P1, Q1, R1, S1, T1, U1, V1, W1, minus, X1, Y1], A1, E1/Z1), aux([A2, B2, C2, D2, E2, F2, J1, G2, H2, I2, minus, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2], B1, Z1/Y2), verb([Z2, A3, B3, C3, D3, E3, J1, F3, G3, H3, minus, inf, I3, J3, tr, K3, L3, M3, N3, O3, P3, Q3, R3, S3, T3, U3], C1, Y2/V3), vmod([A, G1, C, K1, W3, X3, Y3, Z3, A4, J, B4, C4, N1, minus, D4, E4, F4, G4, H4, I4, J4, K4, L4, M4, N4, O4], D1, V3/P4), ~(E1/P4/F1). relcl2([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(relcl2(subj:D, rel:J, qu:A, whin:B, whout:C), (A1, B1, C1)), D1/E1)-->np([A, B, F1, D, G1, H1, I1, nom, J1, minus, K1, L1, M1, minus, N1, O1, P1, Q1, R1, S1, T1, U1, V1, minus, W1, X1], A1, D1/Y1), verb([Z1, A2, B2, C2, D2, E2, I1, F2, G2, H2, minus, fin, I2, J2, tr, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2], B1, Y1/V2), vmod([A, F1, C, J1, W2, X2, Y2, Z2, A3, J, B3, C3, M1, minus, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, N3, O3], C1, V2/P3), ~(D1/P3/E1). /* Relative pronouns are represented by 'relpron' and can be either "that", "who" or "which": */ relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, that], =>(relpron(relpron:that), [that]), Z/Z)-->[that]. relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, plus, Q, R, S, T, U, V, W, X, who], =>(relpron(human:plus, relpron:who), [who]), Y/Y)-->[who]. relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, minus, Q, R, S, T, U, V, W, X, which], =>(relpron(human:minus, relpron:which), [which]), Y/Y)-->[which]. /* The categories 'or_relpron' and 'and_relpron' define shortcuts - like "or that" as one token - for better usability inside of the predictive editor: */ or_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(or_relpron(human:Q, relpron:Z), ([or], A1)), B1/C1)-->[or], relpron([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, Q, T1, U1, V1, W1, X1, Y1, Z1, A2, Z], A1, B1/C1). or_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, that], =>(or_relpron(relpron:that), ['or that']), Z/Z)-->['or that']. or_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, plus, Q, R, S, T, U, V, W, X, who], =>(or_relpron(human:plus, relpron:who), ['or who']), Y/Y)-->['or who']. or_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, minus, Q, R, S, T, U, V, W, X, which], =>(or_relpron(human:minus, relpron:which), ['or which']), Y/Y)-->['or which']. and_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(and_relpron(human:Q, relpron:Z), ([and], A1)), B1/C1)-->[and], relpron([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, Q, T1, U1, V1, W1, X1, Y1, Z1, A2, Z], A1, B1/C1). and_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, that], =>(and_relpron(relpron:that), ['and that']), Z/Z)-->['and that']. and_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, plus, Q, R, S, T, U, V, W, X, who], =>(and_relpron(human:plus, relpron:who), ['and who']), Y/Y)-->['and who']. and_relpron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, minus, Q, R, S, T, U, V, W, X, which], =>(and_relpron(human:minus, relpron:which), ['and which']), Y/Y)-->['and which']. /* --- Verb Phrase Modifiers --- */ /* Verb phrase modifiers are represented by 'vmod' and the auxiliary category 'vmod_x', and are always optional: */ vmod([A, B, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(vmod(whin:B, whout:B), []), Z/Z)-->[]. vmod([A, B, C, D, E, F, G, H, I, J, K, L, minus, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(vmod(subj:D, rel:J, embv:minus, copula:M, qu:A, whin:B, whout:C), (Z, A1)), B1/C1)-->adv_coord([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, M, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], Z, B1/C2), vmod_x([A, B, C, D, D2, E2, F2, G2, H2, J, I2, J2, K2, M, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2], A1, C2/C1). vmod([A, B, C, D, E, F, G, H, I, J, K, L, minus, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(vmod(subj:D, rel:J, embv:minus, copula:M, qu:A, whin:B, whout:C), (Z, A1)), B1/C1)-->pp([A, B, D1, D, E1, F1, G1, H1, I1, J, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1], Z, B1/Z1), vmod([A, D1, C, D, A2, B2, C2, D2, E2, J, F2, G2, L1, M, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2], A1, Z1/C1). vmod_x([A, B, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(vmod_x(whin:B, whout:B), []), Z/Z)-->[]. vmod_x([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(vmod_x(subj:D, rel:J, copula:N, qu:A, whin:B, whout:C), (A1, B1)), C1/D1)-->pp([A, B, E1, D, F1, G1, H1, I1, J1, J, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1], A1, C1/A2), vmod([A, E1, C, D, B2, C2, D2, E2, F2, J, G2, H2, M1, N, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2], B1, A2/D1). /* The category 'pp' represents prepositional phrases: */ pp([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(pp(subj:D, rel:J, embv:M, qu:A, whin:B, whout:C), (A1, B1)), C1/D1)--> $prep([E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2], A1, C1/C1), np([A, B, C, D, E2, F2, G2, acc, H2, J, I2, J2, M, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2], B1, C1/D1). /* Adverbs can be coordinated by "and", which is represented by 'adv_coord': */ adv_coord([A, B, C, D, E, F, G, H, I, J, K, L, M, minus, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(adv_coord(copula:minus), Z), A1/B1)-->adv_phrase([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], Z, A1/B1). adv_coord([A, B, C, D, E, F, G, H, I, J, K, L, M, minus, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(adv_coord(copula:minus), (Z, [and], A1)), B1/C1)-->adv_phrase([D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2], Z, B1/D2), [and], adv_coord([E2, F2, G2, H2, I2, J2, K2, L2, M2, N2, O2, P2, Q2, R2, S2, T2, U2, V2, W2, X2, Y2, Z2, A3, B3, C3, D3], A1, D2/C1). /* Adverbial phrases are represented by 'adv_phrase', and can be in positive, comparative or superlative form: */ adv_phrase([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adv_phrase, A1), B1/B1)--> $adv([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adv_phrase([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adv_phrase, ([more], A1)), B1/B1)-->[more], $adv([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adv_phrase([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adv_phrase, A1), B1/B1)--> $adv_comp([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adv_phrase([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adv_phrase, ([most], A1)), B1/B1)-->[most], $adv([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). adv_phrase([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(adv_phrase, A1), B1/B1)--> $adv_sup([C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2], A1, B1/B1). /* --- Verbs --- */ /* The category 'verb' represents main verbs that can be intransitive or transitive: */ verb([A, B, C, D, E, F, minus, G, H, I, minus, fin, J, K, itr, L, M, N, O, P, Q, R, S, T, U, V], =>(verb(be:minus, vcat:itr, pl:minus, vform:fin), W), X/X)--> $iv_finsg([Y, Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], W, X/X). verb([A, B, C, D, E, F, plus, G, H, I, minus, fin, J, K, itr, L, M, N, O, P, Q, R, S, T, U, V], =>(verb(be:minus, vcat:itr, pl:plus, vform:fin), W), X/X)--> $iv_infpl([Y, Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], W, X/X). verb([A, B, C, D, E, F, G, H, I, J, minus, inf, K, L, itr, M, N, O, P, Q, R, S, T, U, V, W], =>(verb(be:minus, vcat:itr, vform:inf), X), Y/Y)--> $iv_infpl([Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1], X, Y/Y). verb([A, B, C, D, E, F, minus, G, H, I, minus, fin, J, K, tr, L, M, N, O, P, Q, R, S, T, U, V], =>(verb(be:minus, vcat:tr, pl:minus, vform:fin), W), X/X)--> $tv_finsg([Y, Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], W, X/X). verb([A, B, C, D, E, F, plus, G, H, I, minus, fin, J, K, tr, L, M, N, O, P, Q, R, S, T, U, V], =>(verb(be:minus, vcat:tr, pl:plus, vform:fin), W), X/X)--> $tv_infpl([Y, Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1], W, X/X). verb([A, B, C, D, E, F, G, H, I, J, minus, inf, K, L, tr, M, N, O, P, Q, R, S, T, U, V, W], =>(verb(be:minus, vcat:tr, vform:inf), X), Y/Y)--> $tv_infpl([Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1], X, Y/Y). verb([A, B, C, D, E, F, G, H, I, J, plus, K, L, M, tr, N, O, P, Q, R, S, T, U, V, W, X], =>(verb(be:plus, vcat:tr), Y), Z/Z)--> $tv_pp([A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1], Y, Z/Z). /* Auxiliary verbs are represented by 'aux', which includes negation markers: */ aux([A, B, C, D, plus, E, minus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:plus, pl:minus), [is]), X/X)-->[is]. aux([A, B, C, D, minus, E, minus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:minus), (//, ['is not'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['is not']. aux([A, B, C, D, minus, E, minus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:minus), (//, [is, not])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), [is, not]. aux([A, B, C, D, plus, E, plus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:plus, pl:plus), [are]), X/X)-->[are]. aux([A, B, C, D, minus, E, plus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:plus), (//, ['are not'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['are not']. aux([A, B, C, D, minus, E, plus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:plus), (//, [are, not])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), [are, not]. aux([A, B, C, D, minus, E, minus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:minus), (//, ['does not'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['does not']. aux([A, B, C, D, minus, E, plus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:plus), (//, ['do not'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['do not']. aux([A, B, C, D, minus, E, F, G, H, I, minus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:minus, exist:minus), (//, [can])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [can]. aux([A, B, C, D, minus, E, F, G, H, I, minus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:minus, exist:minus), (//, [should])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [should]. aux([A, B, C, D, minus, E, F, G, H, I, minus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:minus, exist:minus), (//, [must])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [must]. aux([A, B, C, D, minus, E, minus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:minus), (//, ['has to'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['has to']. aux([A, B, C, D, minus, E, plus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:plus), (//, ['have to'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['have to']. aux([A, B, C, D, minus, E, F, G, H, I, plus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:plus, exist:minus), (//, [can, be])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [can, be]. aux([A, B, C, D, minus, E, F, G, H, I, plus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:plus, exist:minus), (//, [should, be])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [should, be]. aux([A, B, C, D, minus, E, F, G, H, I, plus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:plus, exist:minus), (//, [must, be])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [must, be]. aux([A, B, C, D, minus, E, minus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:minus), (//, ['has to', be])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['has to', be]. aux([A, B, C, D, minus, E, plus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:plus), (//, ['have to', be])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['have to', be]. aux([A, B, C, D, minus, E, F, G, H, I, plus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:plus, exist:minus), (//, [cannot, be])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [cannot, be]. aux([A, B, C, D, minus, E, F, G, H, I, plus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:plus, exist:minus), (//, [can, not, be])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [can, not, be]. aux([A, B, C, D, minus, E, F, G, H, I, plus, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X], =>(aux(be:plus, exist:minus), (//, [should, not, be])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [should, not, be]. aux([A, B, C, D, minus, E, minus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:minus), (//, ['does not', 'have to', be])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['does not', 'have to', be]. aux([A, B, C, D, minus, E, plus, F, G, H, plus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:plus, exist:minus, pl:plus), (//, ['do not', 'have to', be])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['do not', 'have to', be]. aux([A, B, C, D, minus, E, minus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:minus), (//, [cannot])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), [cannot]. aux([A, B, C, D, minus, E, minus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:minus), (//, [can, not])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), [can, not]. aux([A, B, C, D, minus, E, minus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:minus), (//, [should, not])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), [should, not]. aux([A, B, C, D, minus, E, minus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:minus), (//, ['does not', 'have to'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['does not', 'have to']. aux([A, B, C, D, minus, E, plus, F, G, H, minus, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W], =>(aux(be:minus, exist:minus, pl:plus), (//, ['do not', 'have to'])), X/Y)-->[Z, A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1]// (X/Y), ['do not', 'have to']. /* --- Quantifiers --- */ /* Existential and universal quantifiers are represented by 'quant': */ quant([A, B, C, D, plus, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(quant(exist:plus), [a]), Z/Z)-->[a]. quant([A, B, C, D, plus, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(quant(exist:plus), [an]), Z/Z)-->[an]. quant([A, B, C, D, minus, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(quant(exist:minus), (//, [every])), Z/A1)-->[B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2]// (Z/A1), [every]. quant([A, B, C, D, minus, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y], =>(quant(exist:minus), (//, [no])), Z/A1)-->[B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2]// (Z/A1), [no]. /* The category 'num_quant' stands for numerical quantifiers: */ num_quant([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(num_quant, ['at least']), A1/A1)-->['at least']. num_quant([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(num_quant, ['at most']), A1/A1)-->['at most']. num_quant([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(num_quant, ['less than']), A1/A1)-->['less than']. num_quant([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(num_quant, ['more than']), A1/A1)-->['more than']. num_quant([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z], =>(num_quant, [exactly]), A1/A1)-->[exactly]. /* --- Indefinite Pronouns --- */ /* Indefinite pronouns are represented by 'ipron': */ ipron([A, B, C, D, plus, E, F, G, H, I, J, K, L, M, N, O, minus, P, Q, R, S, T, U, V, W, X], =>(ipron(exist:plus, human:minus), [something]), Y/Y)-->[something]. ipron([A, B, C, D, plus, E, F, G, H, I, J, K, L, M, N, O, plus, P, Q, R, S, T, U, V, W, X], =>(ipron(exist:plus, human:plus), [somebody]), Y/Y)-->[somebody]. ipron([A, B, C, D, minus, E, F, G, H, I, J, K, L, M, N, O, minus, P, Q, R, S, T, U, V, W, X], =>(ipron(exist:minus, human:minus), (//, [everything])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [everything]. ipron([A, B, C, D, minus, E, F, G, H, I, J, K, L, M, N, O, plus, P, Q, R, S, T, U, V, W, X], =>(ipron(exist:minus, human:plus), (//, [everybody])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [everybody]. ipron([A, B, C, D, minus, E, F, G, H, I, J, K, L, M, N, O, minus, P, Q, R, S, T, U, V, W, X], =>(ipron(exist:minus, human:minus), (//, [nothing])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [nothing]. ipron([A, B, C, D, minus, E, F, G, H, I, J, K, L, M, N, O, plus, P, Q, R, S, T, U, V, W, X], =>(ipron(exist:minus, human:plus), (//, [nobody])), Y/Z)-->[A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1]// (Y/Z), [nobody]. /* --- Anaphoric Pronouns --- */ /* The category 'pron' represents reflexive and irreflexive anaphoric pronouns: */ $pron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, minus, Q, R, S, T, U, V, plus, W, X], =>($pron(refl:plus, human:minus), [itself]), Y/Y)-->[itself]. $pron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, plus, masc, Q, R, S, T, U, plus, V, W], =>($pron(refl:plus, human:plus, gender:masc), [himself]), X/X)-->[himself]. $pron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, plus, fem, Q, R, S, T, U, plus, V, W], =>($pron(refl:plus, human:plus, gender:fem), [herself]), X/X)-->[herself]. $pron([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, minus, Q, R, S, T, U, V, minus, W, X], =>($pron(refl:minus, human:minus), [it]), Y/Y)-->[it]. $pron([A, B, C, D, E, F, G, nom, H, I, J, K, L, M, N, O, plus, masc, P, Q, R, S, T, minus, U, V], =>($pron(refl:minus, case:nom, human:plus, gender:masc), [he]), W/W)-->[he]. $pron([A, B, C, D, E, F, G, acc, H, I, J, K, L, M, N, O, plus, masc, P, Q, R, S, T, minus, U, V], =>($pron(refl:minus, case:acc, human:plus, gender:masc), [him]), W/W)-->[him]. $pron([A, B, C, D, E, F, G, nom, H, I, J, K, L, M, N, O, plus, fem, P, Q, R, S, T, minus, U, V], =>($pron(refl:minus, case:nom, human:plus, gender:fem), [she]), W/W)-->[she]. $pron([A, B, C, D, E, F, G, acc, H, I, J, K, L, M, N, O, plus, fem, P, Q, R, S, T, minus, U, V], =>($pron(refl:minus, case:acc, human:plus, gender:fem), [her]), W/W)-->[her]. ~(I/T/O) --> {append([X,[//|N],I],T), \+ member(//,N), findall(>>(R),member(>>(R),X),Y), append([Y,N,I],O)}, !. ~(_/O/O) --> []. //(_, T/[//|T]) --> []. >(F, T/[>(F)|T]) --> []. >>(F, T/[>>(F)|T]) --> []. <(L, [R|T]/[R|T]) --> {R =.. [_,Q], \+ member(-Q, L), \+ \+ member(+Q, L), !, member(+Q, L)}. <(L, [R|T]/[R|T]) --> <(L,T/T). /<(F, T/T) --> {\+ (member(R,T), R =.. [_,F])}, !. #(#(P),L,L) :- length(L,P).