To try to make this concrete, if you have a program A that does bubble sort, and a program B that does selection sort:
1. VBB would be making it so you can't glean information about A or B by running VBB(A) or VBB(B) or examining them, for various definitions of "information".
You can't tell A is a bubble sort at all, and you can't tell B is a selection sort at all.
VBB is, as mentioned, impossible in the general case.
2. IO would be making it so if you are holding IO(A) and IO(B), you can't tell them apart, and can't tell if the original was A or B.
So you can have functionally identical programs, and when you run them through IO, you can't tell whether the original was A or B.
I'm kind of confused. I'm guessing this is a dumb question, but I'm obviously missing something. If a program is running bubble sort, and another is running selection sort... can't you just run them instruction-by-instruction to see which elements they swap? And deduce what they were based on that? Like if you have [4, 3, 2, 1], and the first swap the program does results in [1, 3, 2, 4], then it clearly wasn't bubble sort, right? What am I missing?
Yeah, I probably should have collected an the pieces into a single reply. Right now the number of comments is small enough that it’s not hard to find though.
1. VBB would be making it so you can't glean information about A or B by running VBB(A) or VBB(B) or examining them, for various definitions of "information".
You can't tell A is a bubble sort at all, and you can't tell B is a selection sort at all.
VBB is, as mentioned, impossible in the general case.
2. IO would be making it so if you are holding IO(A) and IO(B), you can't tell them apart, and can't tell if the original was A or B.
So you can have functionally identical programs, and when you run them through IO, you can't tell whether the original was A or B.