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>
7namespace 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
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 }
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:
圧縮していない moveの表現 .
Definition: basic_type.h:1052
Ptype ptype() const
Definition: basic_type.h:1155
bool isDrop() const
Definition: basic_type.h:1150
bool isNormal() const
INVALID でも PASS でもない.
Definition: basic_type.h:1088
証明数(proof number)と反証数(disproof number).
Definition: proofDisproof.h:17
static const ProofDisproof PawnCheckmate()
Definition: proofDisproof.h:77
static const ProofDisproof AttackBack()
Definition: proofDisproof.h:79
static unsigned long long compose(unsigned long long proof, unsigned long long disproof)
Definition: proofDisproof.h:45
static const ProofDisproof LoopDetection()
Definition: proofDisproof.h:78
unsigned long long ulonglongValue() const
Definition: proofDisproof.h:99
static const ProofDisproof Bottom()
攻方にも受方にも不都合な仮想的な数
Definition: proofDisproof.h:82
static const ProofDisproof NoEscape()
Definition: proofDisproof.h:74
@ NO_ESCAPE_DISPROOF
反証数の定数: 詰んだ時には,詰の種類の区別に利用
Definition: proofDisproof.h:26
@ NO_CHECK_MATE_PROOF
証明数の定数: 反証された時には,不詰の種類の区別に利用
Definition: proofDisproof.h:29
static const ProofDisproof NoCheckmate()
Definition: proofDisproof.h:76
static const unsigned int BigProofNumber
const ProofDisproof & betterForDefense(const ProofDisproof &r) const
受方に都合が良い方を返す
static const ProofDisproof makeDirect(unsigned long long value)
Definition: proofDisproof.h:71
ProofDisproof(unsigned long long value)
range check をしない private バージョン
Definition: proofDisproof.h:50
ProofDisproof(unsigned int proof, unsigned int disproof)
Definition: proofDisproof.h:62
bool isBetterForAttack(const ProofDisproof &r) const
this が r より攻方に都合が良い時に真
@ PROOF_LIMIT
通常の証明数の上限
Definition: proofDisproof.h:41
@ DISPROOF_LIMIT
通常の反証数の上限
Definition: proofDisproof.h:39
const ProofDisproof & betterForAttack(const ProofDisproof &r) const
攻方に都合が良い方を返す
unsigned int disproof() const
Definition: proofDisproof.h:85
unsigned int proof() const
Definition: proofDisproof.h:84
bool isPawnDropFoul(Move move) const
打歩詰めなら真
Definition: proofDisproof.h:92
static const ProofDisproof make(unsigned int proof, unsigned int disproof)
Definition: proofDisproof.h:54
static const ProofDisproof Checkmate()
Definition: proofDisproof.h:75
bool isBetterForDefense(const ProofDisproof &r) const
this が r より受方に都合が良い時に真
static const ProofDisproof Unknown()
Definition: proofDisproof.h:80
std::ostream & operator<<(std::ostream &, King8Info)
Definition: king8Info.cc:10
bool operator!=(const ProofDisproof &l, const ProofDisproof &r)
bool operator==(const ProofDisproof &l, const ProofDisproof &r)
bool operator<(const ProofDisproof &l, const ProofDisproof &r)
@ PAWN
Definition: basic_type.h:95