Out of curiosity, what's the use case for a configuration like this?
Is it possible to do this using the bitcoin scripting language? Yes, absolutely. Making it and actually having it included into a block is questionable, mainly because it would be a non standard transaction type.
There aren't really a lot of tools to help you do it, though. I can describe what the scripts would have to look like, but not sure how you would actually make such a transaction. This question might be of interest to you as well.
The assumed scriptSig, where we don't know what combination of signatures we have:
0 {sig1} {sig2}
The scriptPubKey would be a standard P2SH pub key script:
OP_HASH160 {hash} EQUAL
The redeemScript (in this P2SH transaction) might look something like:
3DUP 2 {A_pub} {B_pub} 2 CHECKMULTISIG DUP NOTIF
3DUP 2 {C_pub} {D_pub} 2 CHECKMULTISIG DUP NOTIF
3DUP 2 {A_pub} {D_pub} 2 CHECKMULTISIG
ENDIF
ENDIF
I believe this would work, but if someone could check the logic of this script here, I'd appreciate it. The OP_3DUP is necessary because the scriptSig should have 3 items on it already (2 signatures and the OP_0 to satisfy the off-by-1 error in the original client), and those 3 items need to be used more than once.
1Minor justification: there are six ways to select 2 from 4. – Madzi Konjo – 2014-10-24T04:57:22.317
@MadziKonjo Good point. We don't care about the difference between A, B and B, A. – Nick ODell – 2014-10-26T15:09:13.223
This is a usecase for the question: It would be possible for an oracle to release ether key B or C. Now A OR D could access the funds. The oracle can never access the funds AND it does not need to have to know about Alice and Dennis or about the transaction. It only releases a key. – user599464 – 2014-10-29T15:17:22.720