public Property or(final Property p) {
    return fromGen(gen().bind(p.gen(), new F<Result, F<Result, Result>>() {
      public F<Result, Result> f(final Result res1) {
        return new F<Result, Result>() {
          public Result f(final Result res2) {
            return res1.isException() || res1.isFalsified() ? res1 : res2.isException() || res2.isFalsified() ? res2 : res1.isProven() || res1.isUnfalsified() ? res1 : res2.isProven() || res2.isUnfalsified() ? res2 : noResult();
          }
        };
      }
    }));
  }