Chances are slight that Bernhard is gray. There is almost no chance that Greg is a swan. It is likely that John went to the bedroom. It is impossible that if 'Bernhard is gray and Greg is a swan' then Jeff moved to the office. It is unlikely that if 'Bernhard is gray' or 'John went to the bedroom' or both then Brian is yellow. It is likely that if either 'Bernhard is gray' or 'Greg is a swan' but not both then Lily is a swan.
There is almost no chance that either 'Greg is a swan' or 'Jeff moved to the office' but not both.
There is almost no chance that either 'Greg is a swan' or 'Jeff moved to the office' but not both.
It is probably the case that either 'Greg is a swan' or 'Jeff moved to the office' but not both.

  and(A,B) :- A,B.
  or(A,B) :- A;B.
  nand(A,B) :- not(and(A,B)).
  nor(A,B) :- not(or(A,B)).
  xor(A,B) :- or(A,B), nand(A,B).

  %hop0
  0.1::factA.
  0.02::factB.
  0.7::factC.
  %hop1
  0.0::factX:-and(factA,factB).
  0.2::factY:-or(factA,factC).
  0.7::factZ:-xor(factA,factB).

  %hop2
  conclusion:-xor(factB,factX).

  query(conclusion).
  
Either 'Greg is a swan' or 'Jeff moved to the office' but not both.