haskell在数理逻辑中的应用
基本逻辑运算符定义
逻辑与、逻辑或、蕴涵、相等,逻辑非用not函数,逻辑与用&&函数,逻辑或用||,蕴涵函数定义一个操作符“==>”,然后定义相等操作符“<=>”。
(==>)::Bool->Bool->Bool
True==>p =p
False==>p =True
(<=>)::Bool->Bool->Bool
x<=>y=x==y
加载程序后测试一下:
*Main> (6<7)==>(9<10)
True
*Main> (6<7)==>(9>10)
False
*Main> True&&False
False
*Main> True||False
True
*Main> (6<7)==>(9>10)
False
*Main> (6<7)==>(9<10)
True
*Main> not ((6<7)<=>(9>10))
True
二)量词与谓词逻辑
(1)存在量词
存在M中的一个x,使p(x)成立,简记为:∃x ∈ M,p(x),可读为存在一个x属于M,使p(x)成立。在谓词逻辑中描述为:∃x(p(x)),我们构造一个存在量词的例子:
∃x∃y∃z (x<=y∧y<=z=>x=z)
存在x,y,z使得x<=y,y<=z,则存在x,z使得x=z
我们把x,y和z的范围设置在1-100以内,用haskell运行:
Prelude> any (\(x,z)->x==z) [(x,z)|x<-[1..100],y<-[1..100],z<-[1..100],x<=y,y<=z]
True
然后看看相反的测试
Prelude> all (\(x,z)->x/=z) [(x,z)|x<-[1..100],y<-[1..100],z<-[1..100],x<=y,y<=z]
False
Prelude>
该命题为真。
(2)全称量词
对M中任意的x,有p(x)成立,记作"∀"x∈M,p(x)。
读作:每一个x属于M,使p(x)成立。在谓词逻辑中描述为:∀x(p(x)),我们构造一个存在量词的例子:
∀x∀y∀z (x<y∧y<z=>x<z)
存在任意的x,y,z使得x<=,y<z,则所有x,z使得x<z
我们把x,y和z的范围设置在1-100以内,用haskell运行:
Prelude> all (\(x,z)->x<z) [(x,z)|x<-[1..100],y<-[1..100],z<-[1..100],x<y,y<z]
True
Prelude> any (\(x,z)->x>z) [(x,z)|x<-[1..100],y<-[1..100],z<-[1..100],x<y,y<z]
False
Prelude>
(3)数理逻辑综合应用
A.公式证明
(x^2-1)=(x+1)(x-1),逻辑描述为:∀x∀y∀z (x^2-1=(x+1)(x-1))
编写haskell代码如下:
Prelude> all (\x->(x^2-1)==(x+1)*(x-1)) [x|x<-[1..10000]]
True
Prelude> any (\x->(x^2-1)/=(x+1)*(x-1)) [x|x<-[1..10000]]
False
Prelude>
B.等价式
P->Q<=>┐P∨Q
加载操作符定义文件:
:load "logic.hs"
然后编写代码:
*Main> all (\(x,y)->((x==>y)<=>(not x)||y)) [(x,y)|x<-[True,False],y<-[True,False]]
True
*Main>
再证明一个等价式
┐∀x(p(x))<=>∃x (┐p(x))
*Main> not (all (\x->x>25) [x|x<-[1..100]])<=>any (\x->not (x>25)) [x|x<-[1..100]]
True
*Main>
C.推理的证明
明天是星期一或星期三,我就有课,今天必须备课,我今天下午没备课,所以明天不是星期一和星期三
设p:明天是星期一
q:明天是星期三
r:我有课
S:我备课
结论:
┐p∧┐q
编写代码证明这个结论
*Main> all (\(p,q,r,s)->(((p||q)==>r)&&(r==>s)&&(not s))==>((not p)&&(not q))) [(p,q,r,s)|p<-[True,False],q<-[True,False],r<-[True,False],s<-[True,False]]
True
*Main>