Page 60 - 《软件学报》2025年第8期
P. 60

王榕 等: 基于记忆策略的元解释学习                                                              3483



                 1. 初始化:  DB ← ∅,H ← ∅
                 2. for Atom ∈ E do
                 3.  for  n ∈ [1,N] do
                 4.   for  m ∈ [0, M] do
                 5.    get  Sig
                 6.     Depth = n−length(H)
                 7.    while  Atom = [P|Args] ∈ SLD-tree do
                 8.      if  Atom 是一个常量化目标
                 9.          Goal f = [Depth,Sig,P|Args]
                 10.     else
                                              ′
                 11.          extract(Atom,[P|Args )
                               Goal f = [Depth,Sig,P,Args |H]
                                                   ′
                 12.
                 13.     end if
                                   (    )
                 14.     检查    faulty Goal f   是否已经在失败数据库  DB 中
                                 (   )
                 15.     if  faulty Goal f ∈ DB
                 16.       失败并回溯
                 17.     else
                                       {    (    )}
                 18.          DB ← DB∪ faulty Goal f
                 19.       证明 Atom
                 20.       if true
                 21.              H ← H ∪clause(Atom : −Body)
                 22.         证明子句体中的下一个目标
                 23.       else
                 24.         失败并回溯
                 25.       end if
                 26.     end if
                 27.    end while
                 28.   end for
                 29.  end for
                 30. end for
                 31. return H
                    定义  7 (常量化目标和非常量化目标). 设         P 为一个确定性程序,      G 0  为初始目标,   T  为  P∪{G 0 } 的  SLD-树.  T  上
                 的每一个原子目标都需要被证明. 当原子目标不包含任何变量时, 称其为常量化目标. 当其包含匿名变量时, 称其
                 为非常量化目标.
                    为了更好地理解常量化目标和非常量化目标之间的区别, 考虑图                     3  和图  4  中描述的两个例子. 在图     3  中, 蓝色
                                    f1([1,1,−1,0,−1],[−1,−1,0,1,1]), 作为一个常量化目标的例子. 这是因为它完全由具体值
                 子树的根节点被表示为
                 组成, 没有任何变量, 表明目标中的所有参数都是确定的. 相反, 在图                  4  中, 红色子树的根节点被表示为         f2([1,1,0,
                 −1,−1],Var), 代表了一个非常量化目标. 这里, 变量        Var 的存在意味着目标中的并非所有参数都是指定的, 这使得
                 它包含了未知元素.
                    对于给定的目标, SLD-树的路径将按深度优先顺序进行探索, 直到返回一个成功的分支. 受此启发, 在迭代过
                 程中提取失败分支的失败信息以避免冗余证明是合理的. 相应地, 我们在                      MIL  中设计了一种记忆策略, 从       SLD-树
   55   56   57   58   59   60   61   62   63   64   65