# a minimal query system for arithmetic, using Montague-style semantics # and an embedded GF grammar # examples: "is 131 prime", "2 + 2" # presupposes 'gf -make QueryEng (QuerySwe ...)' import pgf import sys # we assume this abstract syntax absmodule = "Query" # change this to change input language langname = absmodule + "Eng" # the meaning of "number" in unrestricted quantification allNumbers = range(1,10000) def answer(tree): "top level Query interpreter" fun,args = tree.unpack() if fun == "QWhether": ans = predicate(args[1])(value(args[0])) else: # QWhat ans = value(args[0]) return str(ans) def predicate(property): "takes Property or Kind to int -> bool" prop,pargs = property.unpack() if prop == "PPrime": return prime else: print("property not available") def value(term): "takes Term to int, does not cover quantifiers" fun,args = term.unpack() if fun == "TElement": return value(args[0]) elif fun == "EInteger": return int(args[0].unpack()) elif fun == "ESum": return value(args[0]) + value(args[1]) else: print("term not availeble") def prime(n): "simple way to decide if a positive number is prime" if n == 1: r = False else: r = True for k in range(2,n//2+1): if n % k == 0: return False return r def main(): "main function to be called from stdio" # read in the grammar, set up the input language grammar = pgf.readPGF(absmodule + ".pgf") lang = grammar.languages[langname] # read a line of input, parse in lang, return answer line = input("") parseresult = lang.parse(line) prob,tree = parseresult.__next__() print(answer(tree)) main()