I've never really found NOT to be that confusing. Folks just need to think of it as another mathematical function, and not a logic function.
Before I ever really knew the process of WHY NOT was doing what it did, I played around with it and saw WHAT it was doing.
NOT 0? -1
NOT 1? -2
NOT 2? -3
Printing the results in a small loop, I realized, "Hey! All NOT does is Add One and then Negate the result. (It actually flips bits, but when I first was learning BASIC back in the 80s, I had no clue what a bit was, but I could still understand the mathematical operation of "add one, negate".)
Since I always thought of NOT as a math function, instead of a logic function, I never fell into the trap some others have with it.
INSTR returns a value of 0 to wherever the character is in a string. You'll NEVER be able to NOT it and have a value of 0 -- or even a positive value! The result will *ALWAYS* be less than 0.
INSTR and search string doesn't exist? Result is 0. NOT 0 is -1.
INSTR and search string is in the first position? Result is 1. NOT 1 is -2.
Search string found in the Nth position? Result is (N + 1), negated...
And, since BASIC considers any value <> 0 to be TRUE, then *ALL* cases of NOT INSTR are going to be TRUE.
If folks want a logic not, then they should write a quick function for it, instead of trying to use a mathematical one.
FUNCTION LNot (value)
IF value = 0 THEN LNot = -1 ELSE LNot = 0
END FUNCTION
Then you can use it as Luke and Pete described.
IF LNOT(INSTR(a$, search$) THEN....
So now we get a TRUE/FALSE result for if there's search$ in a$, rather than adding one to a positional result and then negating the answer.
************************
If people want to use NOT, AND, OR, and such as logic operators, they should first convert the things they're comparing into logic values.
FUNCTION C2L (value) 'Convert 2 Logic
IF value = 0 then C2L = 0 ELSE C2L = -1
END FUNCTION
4 AND 3 = 0 ----- FALSE
C2L(4) AND C2L(3) = -1 ---- TRUE
Most results aren't 0 or -1, so they're NOT going to be suitable for logic operations. Convert them first, and you're good to go -- just like you may need to use VAL to convert a string or STR$ to convert a number, before you can use them as you want.