% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%   Example code from the book "Natural Language Processing in Prolog"  %
%                      published by Addison Wesley                      %
%        Copyright (c) 1989, Gerald Gazdar & Christopher Mellish.       %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%
% buchart2.pl [Chapter  6] Bottom-up chart parser - with term unification
% to allow use of feature structures it can be set to process agenda items
% depth first or breadth first by flipping two arguments in extend_edges call.
%
% Use 'features' to load up feature-based example files, and 'atomic' to
% load up the standard atomic CF-PSG example files.
%
:- include('library.pl').
:- include('chrtlib2.pl').
%
new_edges(edge(V1,V2,Category1,[]),Chart,Edges) :-
	findall(edge(V1,V1,Category2,[Category4|Categories1]),
		(Category1 = Category4,		% do they unify?
		 rule(Category2,[Category4|Categories1])),
		Edges1),
	findall(edge(V0,V2,Category3,Categories2),
		(Category1 = Category5,		% do they unify?
		 member(edge(V0,V1,Category3,[Category5|Categories2]),Chart)),
		Edges2),
	add_edges(Edges1,Edges2,Edges).
new_edges(edge(V1,V2,Category1,[Category2|Categories]),Chart,Edges) :-
	findall(edge(V1,V3,Category1,Categories),
		(Category2 = Category3,		% do they unify?
		 member(edge(V2,V3,Category3,[]),Chart)),
		Edges).
%
test(String) :-
	start_agenda(String,0,Agenda),
    extend_edges(Agenda,[],Chart),
    found_parse(Chart).