
INPUT TEXT:
A code is valid for a card.
If a code is valid for a card then John waits.
"abc" is a valid name for Bill.
If something is a valid name for something then Mary is a clerk.

RULES:
group([pred_mod(wait,named('John'),[])]) <- [be_adj(A,valid,pos,[modifier_pp(for,B)]), object(A,code,countable,na,eq,1), object(B,card,countable,na,eq,1)].
group([object(named('Mary'),clerk,countable,na,eq,1)]) <- [pred_mod(be,A,B,[modifier_pp(for,C)]), object(C,D,E,F,G,H), object(A,I,J,K,L,M), object(B,name,countable,na,eq,1), property(B,valid,pos)].
property(v(2),valid,pos).
be_adj(v(0),valid,pos,[modifier_pp(for,v(1))]).
pred_mod(be,string(abc),v(2),[modifier_pp(for,named('Bill'))]).
object(named('Bill'),'Bill',named,na,eq,1).
object(named('John'),'John',named,na,eq,1).
object(named('Mary'),'Mary',named,na,eq,1).
object(v(0),code,countable,na,eq,1).
object(v(1),card,countable,na,eq,1).
object(v(2),name,countable,na,eq,1).

SIMPLE RULES:
wait(named('John'),[]) <- [valid(A,[for(B)]), code(A), card(B)].
clerk(named('Mary')) <- [be(A,B,[for(C)]), something(C), something(A), name(B), valid(B)].
valid(v(2)).
valid(v(0),[for(v(1))]).
be(string(abc),v(2),[for(named('Bill'))]).
code(v(0)).
card(v(1)).
name(v(2)).

ANSWERSET #1:
group([pred_mod(wait,named('John'),[])]).
property(v(2),valid,pos).
be_adj(v(0),valid,pos,[modifier_pp(for,v(1))]).
pred_mod(be,string(abc),v(2),[modifier_pp(for,named('Bill'))]).
object(named('Bill'),'Bill',named,na,eq,1).
object(named('John'),'John',named,na,eq,1).
object(named('Mary'),'Mary',named,na,eq,1).
object(v(0),code,countable,na,eq,1).
object(v(1),card,countable,na,eq,1).
object(v(2),name,countable,na,eq,1).

ANSWERTEXT #1:
There is a code X1.
"abc" is a valid name for Bill.
John waits.
The code X1 is valid for a card.

