归纳逻辑程序设计(二)
(Press ?
for help, n
and p
for next and previous slide)
\(A\) | \(B\) | \(A\rightarrow B\) |
---|---|---|
\(True\) | \(True\) | \(True\) |
\(True\) | \(False\) | \(False\) |
\(False\) | \(True\) | \(True\) |
\(False\) | \(False\) | \(False\) |
\(A\) | \(B\) | \(A\rightarrow B\) |
---|---|---|
\(True\) | \(True\) | \(True\) |
\(True\) | \(False\) | \(False\) |
\(False\) | \(True\) | \(X=?\) |
\(False\) | \(False\) | \(Y=?\) |
anim(X):-pet(X).
pet(X):-dog(X).
nice(X):-dog(X).
nice(X):-dog(X),pet(X),anim(X).
hasbeak(X):-bird(X).
bird(X):-vulture(X).
hasbeak(tweaty).
hasbeak(tweaty).
bird(tweaty).
vulture(tweaty).
sentence([],[]).
sentence([a,a,a],[]).
sentence([a,a,a],[]):-sentence([],[]).
越一般的程序应该越短,所以除非有一个极端样本,如 \(nat(s(s(s(s(s(\ldots (0)))))))\)。考虑
% Background knowledge
nat(0).
nat(s(s(X))) :- nat(X).
% Example
nat(s(s(s(s(...s(x)))))). % odd numbers of "s/1"
互递归呢?[A Yamamoto, 1997]
% Background knowledge
even(0).
even(s(X)) :- odd(X).
% Example
odd(s(s(s(0)))).
% Bottom clause
not(Bot) = ( even(0), not( odd( s(s(s(0))) ) ) ).
利用闭世界假设,将 Herbrand Base 里所有非 Herbrand Model 的原子全部纳入进 \(\bot\)。[Muggleton ,1998]
定义(增广底子句集)令 \(B\) 为一个 Horn 子句集合,\(E\) 为一个子句使得 \(F=(B\cup\neg E)\) 可满足(即 \(B\not\models E\))。\(E\) 在 \(B\) 下的增广底子句集 \(BOT(B,E)\) 定义如下:
其中\(\mathrm{B}(F)\) 为 \(F\) 的 Herbrand Base,\(\mathrm{M}(F)\) 为 \(F\) 的 Least Herbrand Model。
Yamamoto 的例子:
定义 (增广底子句集下的逆蕴涵)令 \(B\) 为一个 Horn 子句集,\(E\) 为一个子句使得 \(B\not\models E\)。一个子句 \(H\) 被称为从 \(E\) 通过 \(B\) 下的逆蕴涵获得,当且仅当存在一个 \(H'\in BOT(B,E)\) 有 \(H\preceq H'\)。
Progol 为了控制 \(\bot\) 形式的种类,使用两种 mode 声明谓词:modeh(N, Atom)
和 modeb(N, Atom)
N
叫做 recall,表示一条 \(\bot\) 子句中 Atom
能被实例化的种类个数, N=*
表示无限制次数。Atom=p(T,T,...)
是原子公式的模板。T
可以是 +Type, -Type, #Type
;Type
可以是 int, list, any
等等。
#
表示具体项(ground term)+
表示输入变量(来自它前面原子的 -
变量或规则头)-
表示输出变量(用来给后面的原子做输入)Progol 为了控制 \(\bot\) 形式的长度,使用参数 \(i\) 控制规则深度(即 $i,j$-determinism 里的 \(i\)),用 \(h\) 控制归结证明长度。
例子:
modeh(*, f(+int, -int)).
modeb(*, d(+int, -int)).
modeb(*, f(+int, -int)).
modeb(*, m(+int, -int)).
在 \(i=2\) 时允许下列形式的底子句:
f(A,B) :- d(A,C),f(C,D),m(A,D,B).
f(A,B) :- f(B,C),d(A,C),d(C,D),m(C,D,A).
...
mode
声明和参数 \(i\) 构造一个摄涵 \(e\) 的底子句 \(\bot_i\);构造 \(\bot_i\)
+
关联的变元(初始化时均为 \(e\) 中变元),并记录它们代换了哪些项:- mode(*,mem(+any,+list)).
:- mode(1,((+list) = ([-any|-list]))).
:- aleph_set(i,3).
:- aleph_set(noise,0).
:- determination(mem/2,mem/2).
:- determination(mem/2,'='/2).
:-begin_bg.
:-end_bg.
:-begin_in_pos.
mem(0,[0]).
mem(1,[1]).
mem(2,[2]).
mem(3,[3]).
mem(4,[4]).
mem(0,[0,0]).
mem(0,[0,1]).
mem(0,[0,2]).
mem(1,[0,1]).
mem(0,[1,0]).
mem(0,[2,0]).
mem(1,[1,1]).
mem(1,[2,1]).
mem(1,[1,2]).
mem(2,[2,2]).
mem(2,[3,2]).
mem(2,[2,3]).
mem(3,[2,3]).
mem(3,[4,2,3]).
:-end_in_pos.
:-begin_in_neg.
mem(0,[1,2]).
mem(0,[1]).
mem(1,[0]).
mem(3,[]).
mem(2,[]).
mem(2,[3]).
:-end_in_neg.
?- induce(Program).
[select example] [1]
[sat] [1]
[mem(0,[0])]
[bottom clause]
mem(A,B) :-
B=[A|C].
[literals] [2]
[saturation time] [0.0002422499999999994]
[reduce]
[best label so far] [[1,0,2,1]/0]
mem(A,B).
[19/6]
mem(A,B) :-
B=[A|C].
[12/0]
[-------------------------------------]
[found clause]
mem(A,B) :-
B=[A|C].
[pos cover = 12 neg cover = 0] [pos-neg] [12]
[clause label] [[12,0,1,12]]
[clauses constructed] [2]
[-------------------------------------]
[clauses constructed] [2]
[search time] [0.00035609000000000335]
[best clause]
mem(A,B) :-
B=[A|C].
[pos cover = 12 neg cover = 0] [pos-neg] [12]
[atoms left] [7]
[positive examples left] [7]
[estimated time to finish (secs)] [0.00020771916666666862]
[select example] [9]
[sat] [9]
[mem(1,[0,1])]
[bottom clause]
mem(A,B) :-
B=[C|D], mem(C,B), mem(A,D), D=[A|E].
[literals] [5]
[saturation time] [0.0006302100000000199]
[reduce]
[best label so far] [[1,0,2,1]/0]
mem(A,B).
[7/6]
mem(A,B) :-
B=[C|D].
[7/4]
mem(A,B) :-
B=[C|D], mem(C,B).
[7/4]
mem(A,B) :-
B=[C|D], mem(A,D).
[7/0]
[-------------------------------------]
[found clause]
mem(A,B) :-
B=[C|D], mem(A,D).
[pos cover = 7 neg cover = 0] [pos-neg] [7]
[clause label] [[7,0,2,7]]
[clauses constructed] [4]
[-------------------------------------]
mem(A,B) :-
B=[C|D], D=[A|E].
[clauses constructed] [5]
[search time] [0.0006290810000000036]
[best clause]
mem(A,B) :-
B=[C|D], mem(A,D).
[pos cover = 7 neg cover = 0] [pos-neg] [7]
[atoms left] [0]
[positive examples left] [0]
[estimated time to finish (secs)] [0.0]
[theory]
[Rule 1] [Pos cover = 12 Neg cover = 0]
mem(A,B) :-
B=[A|C].
[Rule 2] [Pos cover = 10 Neg cover = 0]
mem(A,B) :-
B=[C|D], mem(A,D).
[Training set performance]
Actual
+ -
+ 19 0 19
Pred
- 0 6 6
19 6 25
Accuracy = 1
[Training set summary] [[19,0,0,6]]
[time taken] [0.002758692000000007]
[total clauses constructed] [7]
Program = [(mem(_A, _B):-_B=[_|_C], mem(_A, _C)), (mem(_D, _E):-_E=[_D|_])].
:-Negative_Example.
)