Note that:
call(Goal) is logically the same as Goal and !/0 does not cut through call/1.
Success: [eclipse]: [user]. or(A -> B, C) :- call(A), !, call(B). or(_ -> _, C) :- call(C). user compiled 412 bytes in 0.02 seconds [eclipse]: or(write(a)->fail, write(k)). a no. [eclipse]: or(fail->write(here),true). yes. Fail: [eclipse]: call(fail),write(here). no. Error: call(G). (Error 4). call("write(a)"). (Error 5).