Without that I think the best you could do is model your program in some other formal verification system and then convince yourself that your model matches the actual contract.
With such a language you can write proofs about the behavior of the runtime using some proof checker and then programs in it should be simple enough to reason about in a rigorous way.
What I have not seen and what I am curious about is a smart contract language more in the spirit of Idris. That is to say a more complex language design with full dependent types, which would be a lot more difficult to formalize, but would allow you to do really nice things like treat proofs as first class citizens in your actual smart contracts.
The idea about having proofs as values in smart contracts is interesting though. I could see a few neat applications of that.