有没有人尝试过用 prolog 编写(比如)三条群论公理,并实现代数学定理自动证明。
更多信息见网址discuss.visual-prolog.com/viewtopic.php?t=9340&highlight=
更多信息见网址discuss.visual-prolog.com/viewtopic.php?t=9340&highlight=
element(one).
times(one, N, one*N).
times(N, one, N*one).
% Closure
times(A*B, N, (A*B)*N) :- times(A, B, A*B).
times(N, A*B, N*(A*B)) :- times(A, B, A*B).
% Associativity
times(A*B, C, A*(B*C)) :- times(A*B, C, (A*B)*C).
times(A, B*C, (A*B)*C) :- times(A, B*C, A*(B*C)).
% Identity
times(A, E, A) :- element(E).
times(E, A, A) :- element(E).
% Inverses
times(A, 1/A, E) :- element(E).
times(1/A, A, E) :- element(E).
?- times(A, 1/A, X). %持续演绎,符合各种情况
A = one,
X = one* (1/one) ;
A = one*_G3468,
X = one*_G3468* (1/ (one*_G3468)) ;
A = _G3467*one,
X = _G3467*one* (1/ (_G3467*one)) ;
A = one*_G3480*_G3468,
X = one*_G3480*_G3468* (1/ (one*_G3480*_G3468)) ;
A = _G3479*one*_G3468,
X = _G3479*one*_G3468* (1/ (_G3479*one*_G3468)) ;
A = one*_G3486*_G3480*_G3468,
X = one*_G3486*_G3480*_G3468* (1/ (one*_G3486*_G3480*_G3468)) ;
...
?- times(A, B, one). %查询结果的最後二句是由反元素规则引出
A = B, B = one ;
A = B, B = one ;
B = 1/A ;
A = 1/B.
这看你要证明的目标是什麽。因我没有所证明的目标,只求简单表达各律。不同的程序各有精简的方面,不需特别求共同的绝对精简。我建议你先明确定义你要证明的目标和前提,才讨论程序应怎麽写。function 写道:在表达结合律的时候是否可以再简练一点,直接
times(A*B, C, A*(B*C)). 或者A*(B*C) is (A*B)*C.
还有为什么不直接times(a,1/a,one). 如果要防止循环可以cut
?- A=1, B=2, C=3, A*(B*C) is (A*B)*C.
false
function 写道:在表达结合律的时候是否可以再简练一点,直接
times(A*B, C, A*(B*C)). 或者A*(B*C) is (A*B)*C.
times(A*B, C, A*(B*C)).
% Associativity
% For all a, b and c in G, (a • b) • c = a • (b • c).
imply(times(times(A,B),C), times(A,times(B,C))).
imply(times(A,times(B,C)), times(times(A,B),C)).
您在这个论坛的权限:
您不能在这个论坛回复主题