My Project
proofDisproof.h
Go to the documentation of this file.
1 #ifndef _PROOF_DISPROOF_H
2 #define _PROOF_DISPROOF_H
3 
4 #include "osl/basic_type.h"
5 #include <cassert>
6 #include <iosfwd>
7 namespace osl
8 {
9  namespace checkmate
10  {
17  {
18  unsigned long long pdp;
19  public:
20  enum {
22  DISPROOF_MASK = 0xffffffffu,
23  PROOF_MAX = (0xffffffffu / 16),
24  DISPROOF_MAX = (0xffffffffu / 16),
33  };
34  private:
35  static void testConsistency();
36  public:
37  enum {
42  };
43  private:
44  static unsigned long long
45  compose(unsigned long long proof, unsigned long long disproof)
46  {
47  return (proof << PROOF_SHIFT) + disproof;
48  }
50  ProofDisproof(unsigned long long value) : pdp(value)
51  {
52  }
53  static const ProofDisproof
54  make(unsigned int proof, unsigned int disproof)
55  {
57  }
58  public:
60  {
61  }
62  ProofDisproof(unsigned int proof, unsigned int disproof)
64  {
65  assert(proof < PROOF_MAX);
66  assert(disproof < DISPROOF_MAX);
67  assert(proof || disproof);
68  assert((proof == 0) ^ (disproof < DISPROOF_LIMIT));
69  assert((disproof == 0) ^ (proof < PROOF_LIMIT));
70  }
71  static const ProofDisproof makeDirect(unsigned long long value) { return ProofDisproof(value); }
72 
73  // constants
74  static const ProofDisproof NoEscape() { return ProofDisproof(0, NO_ESCAPE_DISPROOF); }
80  static const ProofDisproof Unknown () { return ProofDisproof(1, 1); }
82  static const ProofDisproof Bottom () { return make(PROOF_MAX, DISPROOF_MAX); }
83 
84  unsigned int proof() const { return pdp >> PROOF_SHIFT; }
85  unsigned int disproof() const { return pdp & DISPROOF_MASK; }
86  bool isCheckmateSuccess() const { return proof()==0; }
87  bool isCheckmateFail() const { return disproof()==0; }
88  bool isFinal() const { return isCheckmateSuccess() || isCheckmateFail(); }
89  bool isUnknown() const { return !isFinal(); }
90 
92  bool isPawnDropFoul(Move move) const
93  {
94  return (pdp == NoEscape().pdp) && move.isNormal() && move.isDrop()
95  && (move.ptype()==PAWN);
96  }
97  bool isLoopDetection() const { return pdp == LoopDetection().pdp; }
98 
99  unsigned long long ulonglongValue() const { return pdp; }
100 
101  static const unsigned int BigProofNumber=PROOF_MAX;
102 
106  bool isBetterForAttack(const ProofDisproof& r) const
107  {
108  const unsigned int lp = proof();
109  const unsigned int rp = r.proof();
110  if (lp != rp)
111  return lp < rp;
112  return disproof() > r.disproof();
113  }
117  bool isBetterForDefense(const ProofDisproof& r) const
118  {
119  const unsigned int ld = disproof();
120  const unsigned int rd = r.disproof();
121  if (ld != rd)
122  return ld < rd;
123  return proof() > r.proof();
124  }
129  {
130  return (isBetterForAttack(r) ? *this : r);
131  }
136  {
137  return (isBetterForDefense(r) ? *this : r);
138  }
139  };
140  inline bool operator==(const ProofDisproof& l, const ProofDisproof& r)
141  {
142  return l.ulonglongValue() == r.ulonglongValue();
143  }
144  inline bool operator!=(const ProofDisproof& l, const ProofDisproof& r)
145  {
146  return ! (l == r);
147  }
148  inline bool operator<(const ProofDisproof& l, const ProofDisproof& r)
149  {
150  return l.ulonglongValue() < r.ulonglongValue();
151  }
152 
153  std::ostream& operator<<(std::ostream& os,
154  const ProofDisproof& proofDisproof);
155  } // namespace checkmate
156 
157  using checkmate::ProofDisproof;
158 } // namespace osl
159 #endif // _PROOF_DISPROOF_H
160 // ;;; Local Variables:
161 // ;;; mode:c++
162 // ;;; c-basic-offset:2
163 // ;;; End:
osl::checkmate::ProofDisproof::pdp
unsigned long long pdp
Definition: proofDisproof.h:18
osl::checkmate::ProofDisproof::isCheckmateSuccess
bool isCheckmateSuccess() const
Definition: proofDisproof.h:86
osl::checkmate::ProofDisproof::PAWN_CHECK_MATE_PROOF
@ PAWN_CHECK_MATE_PROOF
Definition: proofDisproof.h:30
osl::checkmate::ProofDisproof::proof
unsigned int proof() const
Definition: proofDisproof.h:84
osl::checkmate::ProofDisproof::isLoopDetection
bool isLoopDetection() const
Definition: proofDisproof.h:97
osl::checkmate::ProofDisproof::NoEscape
static const ProofDisproof NoEscape()
Definition: proofDisproof.h:74
osl::Move
圧縮していない moveの表現 .
Definition: basic_type.h:1052
basic_type.h
osl::checkmate::ProofDisproof::ATTACK_BACK_PROOF
@ ATTACK_BACK_PROOF
Definition: proofDisproof.h:32
osl::checkmate::ProofDisproof::isPawnDropFoul
bool isPawnDropFoul(Move move) const
打歩詰めなら真
Definition: proofDisproof.h:92
osl::checkmate::ProofDisproof::ulonglongValue
unsigned long long ulonglongValue() const
Definition: proofDisproof.h:99
osl::checkmate::ProofDisproof::NO_ESCAPE_DISPROOF
@ NO_ESCAPE_DISPROOF
反証数の定数: 詰んだ時には,詰の種類の区別に利用
Definition: proofDisproof.h:26
osl::checkmate::ProofDisproof::NO_CHECK_MATE_PROOF
@ NO_CHECK_MATE_PROOF
証明数の定数: 反証された時には,不詰の種類の区別に利用
Definition: proofDisproof.h:29
osl::checkmate::ProofDisproof::betterForAttack
const ProofDisproof & betterForAttack(const ProofDisproof &r) const
攻方に都合が良い方を返す
Definition: proofDisproof.h:128
osl::checkmate::ProofDisproof::isFinal
bool isFinal() const
Definition: proofDisproof.h:88
osl::checkmate::operator!=
bool operator!=(const ProofDisproof &l, const ProofDisproof &r)
Definition: proofDisproof.h:144
osl::checkmate::ProofDisproof::isBetterForDefense
bool isBetterForDefense(const ProofDisproof &r) const
this が r より受方に都合が良い時に真
Definition: proofDisproof.h:117
osl::checkmate::ProofDisproof::make
static const ProofDisproof make(unsigned int proof, unsigned int disproof)
Definition: proofDisproof.h:54
osl::checkmate::ProofDisproof::Unknown
static const ProofDisproof Unknown()
Definition: proofDisproof.h:80
osl::checkmate::ProofDisproof::DISPROOF_LIMIT
@ DISPROOF_LIMIT
通常の反証数の上限
Definition: proofDisproof.h:39
checkmate
osl::checkmate::ProofDisproof::testConsistency
static void testConsistency()
Definition: proofDisproof.cc:5
osl::checkmate::ProofDisproof::LoopDetection
static const ProofDisproof LoopDetection()
Definition: proofDisproof.h:78
osl::checkmate::ProofDisproof::ProofDisproof
ProofDisproof(unsigned int proof, unsigned int disproof)
Definition: proofDisproof.h:62
osl::checkmate::ProofDisproof::PROOF_LIMIT
@ PROOF_LIMIT
通常の証明数の上限
Definition: proofDisproof.h:41
osl::Move::isDrop
bool isDrop() const
Definition: basic_type.h:1150
osl::checkmate::ProofDisproof::ProofDisproof
ProofDisproof(unsigned long long value)
range check をしない private バージョン
Definition: proofDisproof.h:50
osl::PAWN
@ PAWN
Definition: basic_type.h:95
osl::checkmate::operator<<
std::ostream & operator<<(std::ostream &, King8Info)
Definition: king8Info.cc:10
osl::checkmate::ProofDisproof::compose
static unsigned long long compose(unsigned long long proof, unsigned long long disproof)
Definition: proofDisproof.h:45
osl::Move::isNormal
bool isNormal() const
INVALID でも PASS でもない.
Definition: basic_type.h:1088
osl::checkmate::ProofDisproof::makeDirect
static const ProofDisproof makeDirect(unsigned long long value)
Definition: proofDisproof.h:71
osl::checkmate::ProofDisproof::DISPROOF_MAX
@ DISPROOF_MAX
Definition: proofDisproof.h:24
osl::Move::ptype
Ptype ptype() const
Definition: basic_type.h:1155
osl::checkmate::ProofDisproof::PROOF_MAX
@ PROOF_MAX
Definition: proofDisproof.h:23
osl::checkmate::ProofDisproof::AttackBack
static const ProofDisproof AttackBack()
Definition: proofDisproof.h:79
osl::checkmate::ProofDisproof::betterForDefense
const ProofDisproof & betterForDefense(const ProofDisproof &r) const
受方に都合が良い方を返す
Definition: proofDisproof.h:135
osl::checkmate::ProofDisproof::isUnknown
bool isUnknown() const
Definition: proofDisproof.h:89
osl::checkmate::ProofDisproof
証明数(proof number)と反証数(disproof number).
Definition: proofDisproof.h:17
osl::checkmate::ProofDisproof::PawnCheckmate
static const ProofDisproof PawnCheckmate()
Definition: proofDisproof.h:77
osl::checkmate::ProofDisproof::Bottom
static const ProofDisproof Bottom()
攻方にも受方にも不都合な仮想的な数
Definition: proofDisproof.h:82
osl::checkmate::ProofDisproof::disproof
unsigned int disproof() const
Definition: proofDisproof.h:85
osl::checkmate::ProofDisproof::CHECK_MATE_DISPROOF
@ CHECK_MATE_DISPROOF
Definition: proofDisproof.h:27
osl::checkmate::ProofDisproof::Checkmate
static const ProofDisproof Checkmate()
Definition: proofDisproof.h:75
osl::checkmate::ProofDisproof::isCheckmateFail
bool isCheckmateFail() const
Definition: proofDisproof.h:87
osl::checkmate::ProofDisproof::ProofDisproof
ProofDisproof()
Definition: proofDisproof.h:59
osl::checkmate::operator==
bool operator==(const ProofDisproof &l, const ProofDisproof &r)
Definition: proofDisproof.h:140
osl::checkmate::ProofDisproof::isBetterForAttack
bool isBetterForAttack(const ProofDisproof &r) const
this が r より攻方に都合が良い時に真
Definition: proofDisproof.h:106
osl::checkmate::ProofDisproof::BigProofNumber
static const unsigned int BigProofNumber
Definition: proofDisproof.h:101
osl::checkmate::ProofDisproof::NoCheckmate
static const ProofDisproof NoCheckmate()
Definition: proofDisproof.h:76
osl::checkmate::operator<
bool operator<(const ProofDisproof &l, const ProofDisproof &r)
Definition: proofDisproof.h:148
osl::checkmate::ProofDisproof::PROOF_SHIFT
@ PROOF_SHIFT
Definition: proofDisproof.h:21
osl::checkmate::ProofDisproof::LOOP_DETECTION_PROOF
@ LOOP_DETECTION_PROOF
Definition: proofDisproof.h:31
osl
Definition: additionalEffect.h:6
osl::checkmate::ProofDisproof::DISPROOF_MASK
@ DISPROOF_MASK
Definition: proofDisproof.h:22