% WAM engine: ISO control constructs (;)/2 and (->)/2.

:- catch(set_prolog_flag(flowlog_engine, wam), _, true).

p(X) :- (X = 1 ; X = 2).

p_cut(X) :- (X = 1, ! ; X = 2).

p_ite(X, Y) :- (X = 1 -> Y = a ; Y = b).

p_ite_fail(Y) :- (fail -> Y = a ; Y = b).

p_if_then_only(Y) :- ((1 = 1) -> Y = a).

p_call(X) :- call(p(X)).

p_once(X) :- once(p(X)).

ok :-
  findall(X, p(X), L1),
  L1 == [1, 2],
  findall(X, p_cut(X), L2),
  L2 == [1],
  findall(pair(X,Y), p_ite(X, Y), L3),
  L3 == [pair(1, a)],
  p_ite_fail(Y4),
  Y4 == b,
  p_if_then_only(Y5),
  Y5 == a,
  findall(X, p_call(X), L4),
  L4 == [1, 2],
  findall(X, p_once(X), L5),
  L5 == [1].
