[Python] define equality predicate Lambda-Calculus nltk

Discussão em 'Python' iniciado por Stack, Novembro 27, 2024.

  1. Stack

    Stack Membro Participativo

    I am trying to define a Lambda-Calculus representation of the word 'are', which is an equality predicate for this ccg:

    ccg = '''
    # CCG grammar
    # complete the lexical entries with their categories and semantics

    :- S, NP, N

    logicians => NP { \\x. LOGICIANS(x) }
    logicians => N { \\x. LOGICIANS(x) }
    linguists => NP { \\x. LINGUISTS(x) }
    linguists => N { \\x. LINGUISTS(x) }
    engineers => NP { \\x. ENGINEERS(x) }
    engineers => N { \\x. ENGINEERS(x) }

    non => NP/N { \\N x. ~N(x) }

    are => (S\\NP)/NP {\\x y.are(x,y)}

    all => NP/N { \\P Q. all x. (P(x) -> Q(x)) }
    no => NP/N { \\P Q. all x. (P(x) -> ~Q(x)) }
    some => NP/N { \\N V. exists x. (N(x) & V(x)) }
    '''


    With this ccg, I want to parse sentences like 'all logicians are linguists'. However, I find it hard to find the correct representation of the word 'are'. For example, I tried to define 'are' as:

    are => (S\\NP)/NP {\\X x.X(\y.are(x,y))}


    Unfortunately, this resulted in a faulty semantic interpretation:

    S {are(\x.LINGUISTS(x),\Q.all x.(LOGICIANS(x) -> Q(x)))}


    Next, I tried to define it as:

    are => (S\\NP)/NP { \\X Y. all y. (X(y) <-> Y(y)) }


    But then I ended up with the following error because y gets interpreted as a variable

    LogicalExpressionException Traceback (most recent call last)

    /usr/local/lib/python3.10/dist-packages/nltk/sem/logic.py in parse(self, data, signature)
    153 try:
    --> 154 result = self.process_next_expression(None)
    155 if self.inRange(0):

    24 frames

    LogicalExpressionException: 'y' is an illegal predicate name. Individual variables may not be used as predicates.


    The above exception was the direct cause of the following exception:

    LogicalExpressionException Traceback (most recent call last)

    /usr/local/lib/python3.10/dist-packages/nltk/sem/logic.py in parse(self, data, signature)
    157 except LogicalExpressionException as e:
    158 msg = "{}\n{}\n{}^".format(e, data, " " * mapping[e.index - 1])
    --> 159 raise LogicalExpressionException(None, msg) from e
    160
    161 if self.type_check:

    LogicalExpressionException: 'y' is an illegal predicate name. Individual variables may not be used as predicates.
    all y.(LINGUISTS(y) <-> all x.(LOGICIANS(x) -> y(x)))


    I can't change the grammar itself (the S,NP,N rules) so I feel like I'm stuck. Is there any way to define the equality relation in Lambda-Calculus for ccg's?

    Continue reading...

Compartilhe esta Página