Statically import fail/0 instead of defining new fields

The compiler almost always created a new field in every predicate
named fail_0, initialized to the static instance inside of Failure.
Instead drop the label and statically import fail_0.

Change-Id: I6542c6eb91e997dc6f32e6680dede943cb034deb
diff --git a/src/compiler/am2j.pl b/src/compiler/am2j.pl
index 04a39b4..846ea83 100644
--- a/src/compiler/am2j.pl
+++ b/src/compiler/am2j.pl
@@ -130,6 +130,12 @@
 	write(Out, 'import '), 
 	write_package(P, Out), 
 	write(Out, '.*;'), nl(Out).
+write_java0(import_static(P,F), _, Out) :- !,
+	write(Out, 'import static '),
+	write_package(P, Out),
+	write(Out, '.'),
+	write(Out, F),
+	write(Out, ';'), nl(Out).
 write_java0(import_package(P,FA), _, Out) :- !,
 	write(Out, 'import '), 
 	write_package(P, Out), 
@@ -143,12 +149,7 @@
 write_java0((Label: Instruction), In, Out) :- !,
 	write_label(Label, Out),
 	write_java0(Instruction, In, Out).
-write_java0(label(fail/0), _, Out) :- !,
-	tab(Out, 4),
-	write(Out, 'static final Operation '),
-	write_index(fail/0, Out),
-	write(Out, ' = com.googlecode.prolog_cafe.lang.Failure.FAIL_0'),
-	write(Out, ';'), nl(Out).
+write_java0(label(fail/0), _, _) :- !.
 write_java0(label(L), _, Out) :- !,
 	tab(Out, 4),
 	write(Out, 'static final Operation '),
@@ -1170,6 +1171,7 @@
 +  end_predicate(p, f/n)
 
 +  import_package(p)
++  import_static(p, f/n)
 +  import_package(p, f/n)
 
 +  main(f/n, public): [Instructions]
diff --git a/src/compiler/pl2am.pl b/src/compiler/pl2am.pl
index dca9608..8700a80 100644
--- a/src/compiler/pl2am.pl
+++ b/src/compiler/pl2am.pl
@@ -102,6 +102,7 @@
   end_predicate(p, f/n)
 
   import_package(p)
+  import_static(p, f/n)
   import_package(p, f/n)
 
   main(f/n, public): [Instructions]
@@ -162,6 +163,7 @@
 :- dynamic package_name/1.
 :- dynamic public_predicates/2.
 :- dynamic import_package/2.
+:- dynamic import_static/2.
 :- dynamic internal_declarations/1.
 :- dynamic file_name/1.
 :- dynamic dummy_clause_counter/1.
@@ -205,6 +207,7 @@
 	retractall(package_name(_)),
 	retractall(public_predicates(_,_)),
 	retractall(import_package(_,_)),
+	retractall(import_static(_,_)),
 	retractall(internal_declarations(_)),
 	retractall(file_name(_)),
 	retractall(dummy_clause_counter(_)),
@@ -251,6 +254,7 @@
 	assert_import('com.googlecode.prolog_cafe.exceptions'),
 	assert_import('com.googlecode.prolog_cafe.lang'),
 	assert_import('com.googlecode.prolog_cafe.lang.ChoicePointFrame'),
+	assert(import_static('com.googlecode.prolog_cafe.lang.Failure', fail_0)),
 	assert_dummy_package,
 	assert_dummy_public.
 
@@ -815,16 +819,23 @@
 
 %%% Import Declarations
 generate_import --> 
+	{findall((P,C), import_static(P, C), S)},
+	gen_importstatic(S),
 	{findall((P,C), import_package(P, C), X)},
-	gen_import(X).
+	gen_importpkg(X).
 
-gen_import([]) --> !.
-gen_import([(P,'*')|Xs]) --> !, 
+gen_importstatic([]) --> !.
+gen_importstatic([(P,C)|Xs]) -->
+	[import_static(P, C)],
+	gen_importstatic(Xs).
+
+gen_importpkg([]) --> !.
+gen_importpkg([(P,'*')|Xs]) --> !,
 	[import_package(P)],
-	gen_import(Xs).
-gen_import([(P,C)|Xs]) --> 
+	gen_importpkg(Xs).
+gen_importpkg([(P,C)|Xs]) -->
 	[import_package(P, C)],
-	gen_import(Xs).
+	gen_importpkg(Xs).
 
 %%% Information
 generate_info(Functor, Arity) --> 
diff --git a/src/lang/Failure.java b/src/lang/Failure.java
index 15c3c04..7b109a0 100644
--- a/src/lang/Failure.java
+++ b/src/lang/Failure.java
@@ -22,7 +22,7 @@
     /** Returns a string representation of this <code>Failure</code>. */
     public String toString(){ return "Failure"; }
 
-    public static final Operation FAIL_0 = new PRED_fail_0();
+    public static final Operation fail_0 = new PRED_fail_0();
     private static final class PRED_fail_0 extends Operation {
       @Override
       public Operation exec(Prolog engine) throws PrologException {