Fourth Task

Our fourth task will be in the context of programming-by-example, a popular application of program synthesis. For this task, you have access to sub-specifications. Please feel free to use them.


In addition, we reproduce the definitions of strat and substr as used in SMT-LIB :

1- string strat(string s, int i) : Singleton string containing a character at given position or empty string when position is out of range. The leftmost position is 0.

2- string substr(string s, int i, int n) : It evaluates to the longest substring of s of length at most n starting at position i. It evaluates to the empty string if n is negative or i is not in the interval [0,l-1] where l is the length of s.

Say the user wishes to synthesize a function f which accepts a string as input and produces a string as output. They specify the function f as follows :

Specification


f("Ducati100")="Ducati"f("Honda125")="Honda"
f("Ducati125")="Ducati"f("Honda250")="Honda"
f("Ducati250")="Ducati"f("Honda550")="Honda"

In response, two different synthesizers produced the following two different implementations :

First Implementation and Sub-specifications

Please hover over different parts of the implementation to see the corresponding sub-specifications.


f(x)= substr( x. false x x. false , x. false 0 x. false , x. false 5 x. false ) x. false + strat( h("Ducati100")="i" h("Honda125")=""
h("Ducati125")="i" h("Honda250")=""
h("Ducati250")="i" h("Honda550")=""
substr( strat(h("Ducati100"), 0)="i" strat(h("Honda125"), 0)=""
strat(h("Ducati125"), 0)="i" strat(h("Honda250"), 0)=""
strat(h("Ducati250"), 0)="i" strat(h("Honda550"), 0)=""
x strat(h("Ducati100"), 5)="i" strat(h("Honda125"), 5)=""
strat(h("Ducati125"), 5)="i" strat(h("Honda250"), 5)=""
strat(h("Ducati250"), 5)="i" strat(h("Honda550"), 5)=""
, strat(h("Ducati100"), 0)="i" strat(h("Honda125"), 0)=""
strat(h("Ducati125"), 0)="i" strat(h("Honda250"), 0)=""
strat(h("Ducati250"), 0)="i" strat(h("Honda550"), 0)=""
5 h("Ducati100")=5 (h("Honda125")=-1 h("Honda125")=8)
h("Ducati125")=5 (h("Honda250")=-1 h("Honda250")=8)
h("Ducati250")=5 (h("Honda550")=-1 h("Honda550")=8)
, strat(h("Ducati100"), 0)="i" strat(h("Honda125"), 0)=""
strat(h("Ducati125"), 0)="i" strat(h("Honda250"), 0)=""
strat(h("Ducati250"), 0)="i" strat(h("Honda550"), 0)=""
4 h("Ducati100")>0 h("Honda125")0
h("Ducati125")>0 h("Honda250")0
h("Ducati250")>0 h("Honda550")0
) strat(h("Ducati100"), 0)="i" strat(h("Honda125"), 0)=""
strat(h("Ducati125"), 0)="i" strat(h("Honda250"), 0)=""
strat(h("Ducati250"), 0)="i" strat(h("Honda550"), 0)=""
, h("Ducati100")="i" h("Honda125")=""
h("Ducati125")="i" h("Honda250")=""
h("Ducati250")="i" h("Honda550")=""
0 h("Ducati100")=0 (h("Honda125")=-1 h("Honda125")=3)
h("Ducati125")=0 (h("Honda250")=-1 h("Honda250")=3)
h("Ducati250")=0 (h("Honda550")=-1 h("Honda550")=3)
) h("Ducati100")="i" h("Honda125")=""
h("Ducati125")="i" h("Honda250")=""
h("Ducati250")="i" h("Honda550")=""


Second Implementation and Sub-specifications

Please hover over different parts of the implementation to see the corresponding sub-specifications.


f(x)= substr( h("Ducati100")="Ducat" h("Honda125")="Hond"
h("Ducati125")="Ducat" h("Honda250")="Hond"
h("Ducati250")="Ducat" h("Honda550")="Hond"
x substr(h("Ducati100"), 0, 5)="Ducat" substr(h("Honda125"), 0, 4)="Hond"
substr(h("Ducati125"), 0, 5)="Ducat" substr(h("Honda250"), 0, 4)="Hond"
substr(h("Ducati250"), 0, 5)="Ducat" substr(h("Honda550"), 0, 4)="Hond"
, h("Ducati100")="Ducat" h("Honda125")="Hond"
h("Ducati125")="Ducat" h("Honda250")="Hond"
h("Ducati250")="Ducat" h("Honda550")="Hond"
0 h("Ducati100")=0 h("Honda125")=0
h("Ducati125")=0 h("Honda250")=0
h("Ducati250")=0 h("Honda550")=0
, h("Ducati100")="Ducat" h("Honda125")="Hond"
h("Ducati125")="Ducat" h("Honda250")="Hond"
h("Ducati250")="Ducat" h("Honda550")="Hond"
len( h("Ducati100")=5 h("Honda125")=4
h("Ducati125")=5 h("Honda250")=4
h("Ducati250")=5 h("Honda550")=4
substr( len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
x len(h("Ducati100"))9 len(h("Honda125"))=8
len(h("Ducati125"))9 len(h("Honda250"))=8
len(h("Ducati250"))9 len(h("Honda550"))=8
, len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
4 0h("Ducati100")4 h("Honda125")=4
0h("Ducati125")4 h("Honda250")=4
0h("Ducati250")4 h("Honda550")=4
, len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
5 h("Ducati100")5 h("Honda125")5
h("Ducati125")5 h("Honda250")5
h("Ducati250")5 h("Honda550")5
) len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
) h("Ducati100")=5 h("Honda125")=4
h("Ducati125")=5 h("Honda250")=4
h("Ducati250")=5 h("Honda550")=4
) h("Ducati100")="Ducat" h("Honda125")="Hond"
h("Ducati125")="Ducat" h("Honda250")="Hond"
h("Ducati250")="Ducat" h("Honda550")="Hond"
+ strat( h("Ducati100")="i" h("Honda125")="a"
h("Ducati125")="i" h("Honda250")="a"
h("Ducati250")="i" h("Honda550")="a"
x strat(h("Ducati100"), 5)="i" strat(h("Honda125"), 4)="a"
strat(h("Ducati125"), 5)="i" strat(h("Honda250"), 4)="a"
strat(h("Ducati250"), 5)="i" strat(h("Honda550"), 4)="a"
, h("Ducati100")="i" h("Honda125")="a"
h("Ducati125")="i" h("Honda250")="a"
h("Ducati250")="i" h("Honda550")="a"
len( h("Ducati100")=5 h("Honda125")=4
h("Ducati125")=5 h("Honda250")=4
h("Ducati250")=5 h("Honda550")=4
substr( len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
x len(h("Ducati100"))9 len(h("Honda125"))=8
len(h("Ducati125"))9 len(h("Honda250"))=8
len(h("Ducati250"))9 len(h("Honda550"))=8
, len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
4 0h("Ducati100")4 h("Honda125")=4
0h("Ducati125")4 h("Honda250")=4
0h("Ducati250")4 h("Honda550")=4
, len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
5 h("Ducati100")5 h("Honda125")5
h("Ducati125")5 h("Honda250")5
h("Ducati250")5 h("Honda550")5
) len(h("Ducati100"))=5 len(h("Honda125"))=4
len(h("Ducati125"))=5 len(h("Honda250"))=4
len(h("Ducati250"))=5 len(h("Honda550"))=4
) h("Ducati100")=5 h("Honda125")=4
h("Ducati125")=5 h("Honda250")=4
h("Ducati250")=5 h("Honda550")=4
) h("Ducati100")="i" h("Honda125")="a"
h("Ducati125")="i" h("Honda250")="a"
h("Ducati250")="i" h("Honda550")="a"


Question 2

Unfortunately, there is a bug in one of the implementations. Which implementation is buggy?

Question 3

Where is the bug?

  • First implementation
  • Second implementation