In short, yes (kinda).
More in detail, Balzac can perform the operations required for HTLC transactions. The following transaction is redeemable by Alice providing the premimage of h, or by Bob after the timelock block 1550000 expires.
transaction T_BtoA {
input = B_funds: sig(kA)
output = 1 BTC:
fun(x,s:string) . sha256(s) == h && versig(kApub;x)
|| checkBlock 1550000 : versig(kBpub;x)
}
So, Balzac can be used to express the transactions of an HTLC, or any payment channel.
BitML is designed to express contracts, and compiles to a set of Balzac transactions.
Thereby, it cannot be used to express arbitrary transactions.
Nonetheless, we can express a similar logic in BitML with the following contract (full code):
(choice
(reveal (h) (withdraw "Alice"))
(after 1550000 (withdraw "Bob")))
This contract compiles to three transactions, one similar to T_BtoA above, and other two to move the bitcoin from the first transaction to either Alice or Bob.
Note that all transactions need to be signed by both participants when stipulating the contract, so they cannot be changed unilaterally.
While BitML can be used to express such transactions, at the moment it cannot express payment channels. With BitML you cannot design contract where the values of transactions are not known at compile time, or that require an unbound number of iterations. However, there is ongoing research to extend BitML with these features.