Go to the documentation of this file. 1 package com.cliffc.aa.HM;
5 import org.jetbrains.annotations.
NotNull;
7 import java.util.HashMap;
20 static final HashMap<String,T2>
PRIMS =
new HashMap<>();
74 public static abstract class Syntax {
79 return t==
_t ? t : (
_t=t);
92 if( work.
find(
this)!=-1 )
return true;
103 }
catch( RuntimeException no_unify ) {
more_work=
true; }
115 return p2(sb.
ii(1),dups).
di(1);
144 for(
Syntax syn = par, prior=
this; syn!=
null; prior=syn, syn=syn.
_par )
145 if( (t = syn.prep_tree_lookup(
_name,prior)) !=
null )
148 if( t==
null )
throw new RuntimeException(
"Parse error, "+
_name+
" is undefined");
277 @Override
SB p1(
SB sb) {
return sb.
p(
"(...)"); }
289 for(
int i=0; i<
_args.length; i++ )
294 T2 ufun = tfun.
unify(nfun,work);
304 for(
Syntax arg :
_args ) arg.prep_tree(
this,work);
309 for(
Syntax arg :
_args )
if( !arg.more_work(work) )
return false;
324 public static class T2 {
346 static T2 prim(String name,
T2... args) {
return new T2(name,args); }
349 T2 t2 =
new T2(name,t);
374 for(
T2 t :
_args )
if( t!=
null ) t.live(visit);
381 if( u==
null )
return this;
382 if( u.
no_uf() )
return u;
393 return u==uu ? uu : (
_args[i]=uu);
400 assert
_args[0]==
null;
401 if(
this==that )
return this;
403 if( work!=
null ) work.addAll(
_updates);
409 return (
_args[0] = that);
416 if(
this==t )
return this;
422 assert
DUPS.isEmpty();
430 static private final HashMap<Long,T2>
DUPS =
new HashMap<>();
433 if(
this==t )
return this;
440 if(
is_leaf() )
return union(t ,work);
444 throw new RuntimeException(
"Cannot unify "+
this+
" and "+t);
447 throw new RuntimeException(
"Cannot unify "+
this+
" and "+t);
450 long luid = ((long)
_uid<<32)|t.
_uid;
451 T2 rez =
DUPS.get(luid), rez2;
452 if( rez!=
null )
return rez;
454 rez = rez2 =
new T2(
_name,args);
458 for(
int i=0; i<
_args.length; i++ )
464 if( eq0 ) rez2 =
this;
466 if( eq0 && eq1 ) rez2 =
_uid < t.
_uid ? this : t;
467 if( rez!=rez2 )
DUPS.put(luid,rez2);
480 T2 prior = vars.get(
this);
503 throw new RuntimeException(
"Cannot unify "+
this+
" and "+t);
506 for(
int i=0; i<
_args.length; i++ )
513 T2 repl(HashMap<T2,T2> vars, HashMap<T2,T2> dups) {
515 T2 t = vars.get(
this);
516 if( t!=
null )
return t;
521 T2 _repl(HashMap<T2,T2> vars, HashMap<T2,T2> dups) {
531 for(
int i=0; i<
_args.length; i++ )
539 if(
this==t )
return false;
540 if( t.
is_leaf() )
return false;
545 for(
int i=0; i<
_args.length; i++ )
551 static private final HashMap<T2,T2>
CDUPS =
new HashMap<>();
553 assert
CDUPS.isEmpty();
560 if(
this==t )
return true;
571 for(
int i=0; i<
_args.length; i++ )
590 for(
int i=0; i<
_args.length; i++ )
605 t._get_dups(visit,dups);
616 return _args[0]==
null ? sb :
_args[0].
str(sb.
p(
">>"), visit, dups);
618 boolean dup = dups.get(
_uid);
619 if( dup ) sb.
p(
'$').
p(
_uid);
620 if( visit.
tset(
_uid) && dup )
return sb;
623 if(
_name.equals(
"->") ) {
625 for(
int i=0; i<
_args.length-1; i++ )
644 boolean dup = dups.get(
_uid);
645 if( dup ) sb.
p(
'$').
p(
_uid);
646 if( visit.
tset(
_uid) && dup )
return sb;
648 if(
_name.equals(
"->") ) {
650 for(
int i=0; i<
_args.length-1; i++ )
651 find(i).
_p(sb,visit,dups).
p(
" ");
652 return find(
_args.length-1).
_p(sb.
p(
"-> "),visit,dups).
p(
" }");
656 for(
int i=0; i<
_args.length; i++ )
find(i).
_p(sb,visit,dups).
p(
" ");
SB p2(SB sb, VBitSet dups)
void prep_tree(Syntax par, Ary< Syntax > work)
SB str(SB sb, VBitSet visit, VBitSet dups)
E push(E e)
Add element in amortized constant time.
SB _p(SB sb, VBitSet visit, VBitSet dups)
void push_update(Syntax a)
static boolean eq(String s0, String s1)
T2 union(T2 that, Ary< Syntax > work)
void prep_tree_impl(Syntax par, T2 t, Ary< Syntax > work)
T2 hm(Ary< Syntax > work)
abstract T2 hm(Ary< Syntax > work)
boolean more_work(Ary< Syntax > work)
an implementation of language AA
static T2 prim(String name, T2... args)
void prep_tree(Syntax par, Ary< Syntax > work)
boolean more_work(Ary< Syntax > work)
Apply(Syntax fun, Syntax... args)
T2(@NotNull String name, T2 @NotNull ... args)
static RuntimeException unimpl()
T2 _unify(T2 t, Ary< Syntax > work)
VBitSet get_dups(VBitSet dups)
void prep_tree(Syntax par, Ary< Syntax > work)
boolean more_work(Ary< Syntax > work)
SB p2(SB sb, VBitSet dups)
abstract boolean more_work(Ary< Syntax > work)
static final TypeInt INT64
T2 hm(Ary< Syntax > work)
T2 hm(Ary< Syntax > work)
boolean more_work(Ary< Syntax > work)
SB p2(SB sb, VBitSet dups)
T2 prep_tree_lookup(String name, Syntax prior)
abstract SB p2(SB sb, VBitSet dups)
SB p2(SB sb, VBitSet dups)
static final HashMap< T2, T2 > CDUPS
static T2 fun(T2... args)
VBitSet _get_dups(VBitSet visit, VBitSet dups)
static T2 hm(Syntax prog)
Lambda2(String arg0, String arg1, Syntax body)
SB p2(SB sb, VBitSet dups)
T2 unify_base(T2 t, Ary< Syntax > work)
boolean more_work(Ary< Syntax > work)
Let(String arg0, Syntax body, Syntax use)
T2 prep_tree_lookup(String name, Syntax prior)
Tight/tiny StringBuilder wrapper.
static final VBitSet UPDATE_VISIT
boolean _cycle_equals(T2 t)
void push_update_impl(Syntax a)
T2 _repl(HashMap< T2, T2 > vars, HashMap< T2, T2 > dups)
an implementation of language AA
static T2 fresh(String name, T2 t)
Lambda(String arg0, Syntax body)
T2 prep_tree_lookup(String name, Syntax prior)
SB p2(SB sb, VBitSet dups)
void prep_tree(Syntax par, Ary< Syntax > work)
boolean cycle_equals(T2 t)
final boolean more_work_impl(Ary< Syntax > work)
abstract void live(IBitSet visit)
T2 hm(Ary< Syntax > work)
T2 hm(Ary< Syntax > work)
T2 prep_tree_lookup(String name, Syntax prior)
abstract void prep_tree(Syntax par, Ary< Syntax > work)
T2 _fresh_unify_impl(HashMap< T2, T2 > vars, T2 t, Ary< Syntax > work)
E del(int i)
Fast, constant-time, element removal.
void prep_tree(Syntax par, Ary< Syntax > work)
int find(E e)
Find the first matching element using ==, or -1 if none.
static final TypeMemPtr STRPTR
T2 unify(T2 t, Ary< Syntax > work)
void prep_tree(Syntax par, Ary< Syntax > work)
T2 hm(Ary< Syntax > work)
T2 _fresh_unify(HashMap< T2, T2 > vars, T2 t, Ary< Syntax > work)
static final HashMap< Long, T2 > DUPS
static final TypeInt BOOL
final SB p0(SB sb, VBitSet dups)
static SB str(SB sb, VBitSet visit, T2 t, VBitSet dups)
T2 repl(HashMap< T2, T2 > vars, HashMap< T2, T2 > dups)
static final TypeFlt FLT64
static final HashMap< String, T2 > PRIMS
boolean more_work(Ary< Syntax > work)