This is a dumbed down version of the dreamcoder
For demonstration let's induce a simple program for some string X using the set of expressions D
>>> X = '10001000100010001000'
>>> D = Deltas([
Delta('0', str),
Delta('1', str),
Delta(2, int),
Delta(3, int),
Delta(add, int, [int, int], repr='+'), # 2 + 3 = 5
Delta(mul, str, [str, int], repr='*'), # '0' * 2 = '00'
Delta(add, str, [str, str], repr='u'), # '1' + '0' = '10'
])
>>> Z = ECD(X, D)
>>> Z[X]
(* '1000' (+ 2 3))
>>> Z[X]()
'10001000100010001000'
ECD extends the starting DSL D with new expressions, in this case it invented a '1000' since there are a lot of these in X
>>> D['1000'].hiddentail
(u '1' (* '0' 3))
>>> D['1000']()
'1000'
ECD stands for explore, compress and dream - three stages of the algorithm: finding X by probabilistically enumerating expressions from DSL, compressing found representations and then training recognition model using those for the next enumeration cycle.