% % Simple Prolog client of the APE webservice. % Note: this program is specific to SWI-Prolog. % Also: http-libraries have to be installed. % % @author Kaarel Kaljurand % @version 2009-05-24 % :- use_module(library('http/http_open')). %% acetext_to_drs(+ACE:atom, -DRS:term, -Messages:list) is det. % % For a given ACE text, generates its DRS. % In case parsing of the ACE text fails then the empty DRS =|drs([], [])|= is generated. % Messages are generated in any case, but if there are no errors nor warnings % then the message list is empty. % % Usage example: % %== % ?- acetext_to_drs('Every man waits.', DRS, Messages). % % DRS = drs([], [=>(drs([_G2327], [object(_G2327, man, countable, na, eq, 1)-1/2]), ... % Messages = []. % % % ?- acetext_to_drs('Every manman waits.', DRS, Messages). % % DRS = drs([], []), % Messages = [message(error, sentence, '1'-'2', 'Every <> manman waits.', % 'This is the first sentence that was not ACE. % The sign <> indicates the position where parsing failed.'), % message(error, word, ''-'', manman, madman)]. % % % ?- acetext_to_drs('JohnJohn waits.', DRS, Messages). % % DRS = drs([_G2389], [predicate(_G2389, wait, named('JohnJohn'))-1/2]), % Messages = [message(warning, word, '1'-'1', 'JohnJohn', % 'Undefined word. Interpreted as a singular proper name.')]. % %== % % @param Address is a triple in the form address(Host, Port, Path) % @param ACE is an ACE text % @param DRS is an Attempto DRS % @param Messages is a list of APE error/warning messages % acetext_to_drs(ACE, DRS, Messages) :- acetext_to_drs(address('attempto.ifi.uzh.ch', 80, '/ws/ape/apews.perl'), ACE, DRS, Messages). acetext_to_drs(address(Host, Port, Path), ACE, DRS, Messages) :- parse_url(URL, [ protocol(http), host(Host), port(Port), path(Path), search([ cdrs = on, text = ACE ]) ]), http_open(URL, Stream, []), load_xml_file(Stream, XML), close(Stream), get_drs(XML, DRS), get_messages(XML, Messages). %% get_drs(+XML:xml, -DRS:term) is det. % % Parses the XML to extract the DRS and convert it into a Prolog term. % % @param XML is SWI Prolog's representation of XML data % @param DRS is an Attempto DRS % get_drs(XML, DRS) :- get_element_content(XML, drs, [DrsAtom]), !, atom_to_term(DrsAtom, DRS, _). %% get_messages(+XML:xml, -Messages:list) is det. % % @param XML is SWI Prolog's representation of XML data % @param Messages is a list of APE error/warning messages % get_messages(XML, Messages) :- get_element_content(XML, messages, MessagesXml), !, messagesxml_to_messages(MessagesXml, Messages). %% messagesxml_to_messages(+MessagesXml:xml, -Messages:list) is det. % % Converts the APE messages in the SWI-Prolog XML notation into the native APE message-terms. % % @param MessagesXml is list of XML elements in SWI-Prolog notation % @param Messages is list of messages % messagesxml_to_messages([], []). % Note: we ignore textual childnodes. % These are always whitespace, the byproduct of XML pretty printing. messagesxml_to_messages([Atom | MessagesXml], Messages) :- atom(Atom), !, messagesxml_to_messages(MessagesXml, Messages). messagesxml_to_messages( [element(message, [importance=Importance, type=Type, sentence=SentenceId, token=TokenId, value=Subject, repair=Description], []) | MessagesXml], [message(Importance, Type, SentenceId-TokenId, Subject, Description) | Messages] ) :- messagesxml_to_messages(MessagesXml, Messages). %% get_element_content(+XML:xml, +ElementName:atom, -Content:term) is nondet. % % @param XML is SWI Prolog's representation of XML data % @param ElementName is the name of the element whose content we want to retrieve % @param Content is the content of the element % get_element_content([element(ElementName, _Attributes, Content) | _], ElementName, Content). get_element_content([element(_, _Attributes, Children) | _], ElementName, Content) :- get_element_content(Children, ElementName, Content). get_element_content([_ | Elements], ElementName, Content) :- get_element_content(Elements, ElementName, Content).