搜索指根据已有(已知)的几何关系, 应用规则, 产生出新的几何关系记录. 以记录为核心, 应用与该记录有关的规则的方式
叫做数据驱动(Data driven) 方式的搜索. 以规则为核心, 找该规则所需的记录的搜索方式, 叫规则驱动搜索.
Gexpert 有多种几何推理算法, 其中先学数据驱动的搜索方式. 数据驱动的具体实现方式, 指的是将几何关系记录(数据)
放入一个队列, 循环直到队列为空, 取出一个数据, 应用与该数据有关的规则(几何定理), 尝试创建/添加新的记录.
创建的新的记录, 也投递到队列的末尾, 在稍后进行搜索.
这个搜索过程是有穷的(即不会队列永远非空), 到队列为空的时候, 搜索全部完成, 称为不动点(fixpoint). 此时,
数据库中就有所有的几何关系记录了(理想情况下). 当然受各种因素影响, 实际上有些关系是无法推出的.
规则(有时也称定理,引理) 被选择了大约 40~50个, 实现在各个数据相关的搜索函数. 例如三角形中点连线定理,
实现在针对中点记录(Midpt)的搜索函数中. 一般每种数据对应一个搜索函数, 一个搜索函数再分支为多个子搜索
函数. 根据数据种类分支到各个搜索函数可看做是一种派发(dispatch)过程.
以下分别研究. 第一个是对共线数据的搜索, 搜索函数对应为 search_ln(L_Line).
共线(CO_COLL) 的搜索函数(当前)只有一个分支, 名为 search_ln_cg(). (未来可能合理添加新的).
规则为: 若点 A,B,M 共线, 及有 AM=MB, 则点 M 是 A,B 的中点(需要辅助以数值判定).
这一过程我把它简写为 R_MIDPT: ln*cg -> md. 即已知 ln, 遍历 cg, 应用规则 R_MIDPT(中点定义和性质),
产生(可能的)中点记录.
伪代码:
已知共线 ln.
foreach (cg) 遍历所有 cg 记录.
如果 cg 的两条线段 a,b 在线 ln 上, 且有共同端点, (且方向,数值验证...)
产生新的中点记录 md.
还尝试写了一个新版本, 遍历 ln 上的三个点组合, 尝试查询是否有 cg 记录, 以产生 md.
可简写为 R_MIDPT: ln[cg] -> md.
其中这里用 [cg] 这里表示是对 cg 记录进行查询. 查询和遍历是有不少区别的. 因为查询可以使用索引, 对大量
记录的情况, 应该比遍历 cg 效率要好. 另重点是不依赖 cg 记录怎么维护(只要有 cg 的索引即可).
伪代码:
已知共线 ln.
foreach (线上不同的三个点的组合 A,B,C) 实现为三重 for 循环.
如果查询 cg 得知 BA=AC, 则 A 是 B,C 的中点. (还需方向,数值判定)
如果查询 cg 得知 AB=BC, 则 B 是 A,C 的中点.
如果查询 cg 得知 AC=CB, 则 C 是 A,B 的中点.
设共线 ln 上有 N 个点 (一般是 3,4 个左右的点, 较少有多点的情况), 则取3点的组合有 N(N-1)(N-2)/6 种,
一般不算很多.
=========================================================
关于共线数据对应的搜索函数的一个疑问是, 共线可能导致的其它关系没有进行搜索. 也许因为这个因素,
某些几何关系就不能正确的被建立起来.
所以, 以后在进一步的研究中, 如果发现还可以根据共线记录搜索别的推论, 可以尝试添加子搜索... 并试验区别.