1 year ago
#205941
PrologGraph
How to add temporal variables to first-order logic formulas?
I've written an English parser in Prolog that uses first-order logic .
I now want to extend this parser so that it's able to tell whether a sentence is in the past, present or future.
In other words, I want my English grammar parser to be able to parse a sentence into a first-order logic formula that contains tense/temporal variables
For example :
The sentence Bill slept.
should be parsed as some(T,and(before(T,now),sleep(bill,T))).
And ambigue example sentences like Every mother loves a child.
should still have several possible parsings :
- some(T,and(eq(T,now), all(X,imp(mother(X),some(Y,and(child(Y),loves(X,Y))))))).
- some(T,and(eq(T,now), some(X,and(child(X),all(Y,imp(mother(Y),loves(Y,X))))))).
However, currently I don't really know how to approach the extension of the first-order logic-formulas with the needed temporal variables.
Therefore my question is if anyone here knows and could point me towards any resources regarding the extension of first-order logic formulas with temportal variables, or kows about any parsers written in Prolog that can handle tense?
Here is my grammar and parts of the lexicon that are relevant for the example sentences:
Grammar
/*========================================================================
Texts
========================================================================*/
t([sem:T])-->
s([coord:no,sem:S]),
{combine(t:T,[s:S])}.
t([sem:T])-->
s([coord:yes,sem:S]),
{combine(t:T,[s:S])}.
t([sem:T])-->
q([sem:Q]),
{combine(t:T,[q:Q])}.
/*========================================================================
Sentences
========================================================================*/
s([coord:no,sem:Sem])-->
np([coord:_,num:Num,gap:[],sem:NP]),
vp([coord:_,inf:fin,num:Num,gap:[],sem:VP]),
{combine(s:Sem,[np:NP,vp:VP])}.
s([coord:yes,sem:Sem])-->
s([coord:ant,sem:S1]),
s([coord:con,sem:S2]),
{combine(s:Sem,[s:S1,s:S2])}.
s([coord:yes,sem:Sem])-->
s([coord:either,sem:S1]),
s([coord:or,sem:S2]),
{combine(s:Sem,[s:S1,s:S2])}.
s([coord:ant,sem:Sem])-->
[if],
s([coord:no,sem:S]),
{combine(s:Sem,[if:S])}.
s([coord:either,sem:Sem])-->
[either],
s([coord:no,sem:S]),
{combine(s:Sem,[either:S])}.
s([coord:con,sem:Sem])-->
[then],
s([coord:no,sem:S]),
{combine(s:Sem,[then:S])}.
s([coord:con,sem:Sem])-->
s([coord:no,sem:S]),
{combine(s:Sem,[then:S])}.
s([coord:or,sem:Sem])-->
[or],
s([coord:no,sem:S]),
{combine(s:Sem,[or:S])}.
sinv([gap:G,sem:S])-->
av([inf:fin,num:Num,sem:Sem]),
np([coord:_,num:Num,gap:[],sem:NP]),
vp([coord:_,inf:inf,num:Num,gap:G,sem:VP]),
{combine(sinv:S,[av:Sem,np:NP,vp:VP])}.
/*========================================================================
Questions
========================================================================*/
q([sem:Sem])-->
whnp([num:Num,sem:NP]),
vp([coord:_,inf:fin,num:Num,gap:[],sem:VP]),
{combine(q:Sem,[whnp:NP,vp:VP])}.
q([sem:Sem])-->
whnp([num:_,sem:NP]),
sinv([gap:[np:NP],sem:S]),
{combine(q:Sem,[sinv:S])}.
/*========================================================================
Noun Phrases
========================================================================*/
np([coord:no,num:sg,gap:[np:NP],sem:NP])--> [].
np([coord:yes,num:pl,gap:[],sem:NP])-->
np([coord:no,num:sg,gap:[],sem:NP1]),
coord([type:conj,sem:C]),
np([coord:_,num:_,gap:[],sem:NP2]),
{combine(np:NP,[np:NP1,coord:C,np:NP2])}.
np([coord:yes,num:sg,gap:[],sem:NP])-->
np([coord:no,num:sg,gap:[],sem:NP1]),
coord([type:disj,sem:C]),
np([coord:_,num:sg,gap:[],sem:NP2]),
{combine(np:NP,[np:NP1,coord:C,np:NP2])}.
np([coord:no,num:sg,gap:[],sem:NP])-->
det([mood:decl,type:_,sem:Det]),
n([coord:_,sem:N]),
{combine(np:NP,[det:Det,n:N])}.
np([coord:no,num:sg,gap:[],sem:NP])-->
pn([sem:PN]),
{combine(np:NP,[pn:PN])}.
np([coord:no,num:sg,gap:[],sem:NP])-->
qnp([mood:decl,sem:QNP]),
{combine(np:NP,[qnp:QNP])}.
/*========================================================================
WH Noun Phrases
========================================================================*/
whnp([num:sg,sem:NP])-->
qnp([mood:int,sem:QNP]),
{combine(whnp:NP,[qnp:QNP])}.
whnp([num:sg,sem:NP])-->
det([mood:int,type:_,sem:Det]),
n([coord:_,sem:N]),
{combine(whnp:NP,[det:Det,n:N])}.
/*========================================================================
Nouns
========================================================================*/
n([coord:yes,sem:N])-->
n([coord:no,sem:N1]),
coord([type:_,sem:C]),
n([coord:_,sem:N2]),
{combine(n:N,[n:N1,coord:C,n:N2])}.
n([coord:C,sem:Sem])-->
adj([sem:A]),
n([coord:C,sem:N]),
{combine(n:Sem,[adj:A,n:N])}.
n([coord:no,sem:N])-->
noun([sem:Noun]),
{combine(n:N,[noun:Noun])}.
n([coord:no,sem:Sem])-->
noun([sem:N]),
nmod([sem:PP]),
{combine(n:Sem,[noun:N,nmod:PP])}.
nmod([sem:N])-->
pp([sem:PP]),
{combine(nmod:N,[pp:PP])}.
nmod([sem:N])-->
rc([sem:RC]),
{combine(nmod:N,[rc:RC])}.
nmod([sem:Sem])-->
pp([sem:PP]),
nmod([sem:NMod]),
{combine(nmod:Sem,[pp:PP,nmod:NMod])}.
/*========================================================================
Verb Phrases
========================================================================*/
vp([coord:yes,inf:Inf,num:Num,gap:[],sem:VP])-->
vp([coord:no,inf:Inf,num:Num,gap:[],sem:VP1]),
coord([type:_,sem:C]),
vp([coord:_,inf:Inf,num:Num,gap:[],sem:VP2]),
{combine(vp:VP,[vp:VP1,coord:C,vp:VP2])}.
vp([coord:no,inf:Inf,num:Num,gap:[],sem:VP])-->
av([inf:Inf,num:Num,sem:Mod]),
vp([coord:_,inf:inf,num:Num,gap:[],sem:V2]),
{combine(vp:VP,[av:Mod,vp:V2])}.
vp([coord:no,inf:Inf,num:Num,gap:[],sem:VP])-->
cop([inf:Inf,num:Num,sem:Cop]),
np([coord:_,num:_,gap:[],sem:NP]),
{combine(vp:VP,[cop:Cop,np:NP])}.
vp([coord:no,inf:Inf,num:Num,gap:[],sem:VP])-->
iv([inf:Inf,num:Num,sem:IV]),
{combine(vp:VP,[iv:IV])}.
vp([coord:no,inf:I,num:Num,gap:G,sem:VP])-->
tv([inf:I,num:Num,sem:TV]),
np([coord:_,num:_,gap:G,sem:NP]),
{combine(vp:VP,[tv:TV,np:NP])}.
/*========================================================================
Prepositional Phrases
========================================================================*/
pp([sem:PP])-->
prep([sem:Prep]),
np([coord:_,num:_,gap:[],sem:NP]),
{combine(pp:PP,[prep:Prep,np:NP])}.
/*========================================================================
Relative Clauses
========================================================================*/
rc([sem:RC])-->
relpro([sem:RP]),
vp([coord:_,inf:fin,num:sg,gap:[],sem:VP]),
{combine(rc:RC,[relpro:RP,vp:VP])}.
/*========================================================================
Lexical Rules
========================================================================*/
%intransitive_Verbs
iv([inf:Inf,num:Num,sem:Sem])-->
{lexEntry(iv,[symbol:Sym,syntax:Word,inf:Inf,num:Num])},
Word,
{semLex(iv,[symbol:Sym,sem:Sem])}.
%transitive_Verbs
tv([inf:Inf,num:Num,sem:Sem])-->
{lexEntry(tv,[symbol:Sym,syntax:Word,inf:Inf,num:Num])},
Word,
{semLex(tv,[symbol:Sym,sem:Sem])}.
%Copulas
cop([inf:Inf,num:Num,sem:Sem])-->
{lexEntry(cop,[pol:Pol,syntax:Word,inf:Inf,num:Num])},
Word,
{semLex(cop,[pol:Pol,sem:Sem])}.
%Determiners
det([mood:M,type:Type,sem:Det])-->
{lexEntry(det,[syntax:Word,mood:M,type:Type])},
Word,
{semLex(det,[type:Type,sem:Det])}.
%Proper_nouns
pn([sem:Sem])-->
{lexEntry(pn,[symbol:Sym,syntax:Word])},
Word,
{semLex(pn,[symbol:Sym,sem:Sem])}.
%relative_Pronouns
relpro([sem:Sem])-->
{lexEntry(relpro,[syntax:Word])},
Word,
{semLex(relpro,[sem:Sem])}.
%Prepositions
prep([sem:Sem])-->
{lexEntry(prep,[symbol:Sym,syntax:Word])},
Word,
{semLex(prep,[symbol:Sym,sem:Sem])}.
%Adjectives
adj([sem:Sem])-->
{lexEntry(adj,[symbol:Sym,syntax:Word])},
Word,
{semLex(adj,[symbol:Sym,sem:Sem])}.
%Adverbs
av([inf:Inf,num:Num,sem:Sem])-->
{lexEntry(av,[syntax:Word,inf:Inf,num:Num,pol:Pol])},
Word,
{semLex(av,[pol:Pol,sem:Sem])}.
%Coordinators
coord([type:Type,sem:Sem])-->
{lexEntry(coord,[syntax:Word,type:Type])},
Word,
{semLex(coord,[type:Type,sem:Sem])}.
%Quantified_Noun_Phrases
qnp([mood:M,sem:NP])-->
{lexEntry(qnp,[symbol:Symbol,syntax:Word,mood:M,type:Type])},
Word,
{semLex(qnp,[type:Type,symbol:Symbol,sem:NP])}.
%Nouns
noun([sem:Sem])-->
{lexEntry(noun,[symbol:Sym,syntax:Word])},
Word,
{semLex(noun,[symbol:Sym,sem:Sem])}.
Lexicon
%Determiners
lexEntry(det,[syntax:[every],mood:decl,type:uni]).
lexEntry(det,[syntax:[a],mood:decl,type:indef]).
%(Proper)Nouns
lexEntry(pn,[symbol:bill,syntax:[bill]]).
lexEntry(noun,[symbol:mother,syntax:[mother]]).
lexEntry(noun,[symbol:child,syntax:[child]]).
%Verbs
lexEntry(iv,[symbol:sleep,syntax:[sleep],inf:inf,num:sg]).
lexEntry(iv,[symbol:sleep,syntax:[sleeps],inf:fin,num:sg]).
lexEntry(iv,[symbol:sleep,syntax:[sleep],inf:fin,num:pl]).
lexEntry(tv,[symbol:love,syntax:[love],inf:inf,num:sg]).
lexEntry(tv,[symbol:love,syntax:[loves],inf:fin,num:sg]).
lexEntry(tv,[symbol:love,syntax:[love],inf:fin,num:pl]).
nlp
prolog
first-order-logic
0 Answers
Your Answer