自然演绎法
基本概念
我们需要有一组规则,每一条都允许我们在特定的前提下得到下一个结论
推断 infer
前提 premise ϕ1,⋯ ,ϕn\phi_1 ,\cdots,\phi_nϕ1,⋯,ϕn
结论 conclusion ψ\psiψ
矢列 sequent
文字 literal: 原子命题或其否定
子句 clause: CNF 的每一个析取向
自然演绎规则
合取引入规则 conjunctive introduction
在分别得到结论 ϕ\phiϕ 和结论 ψ\psiψ 的前提 下推导出结论 ϕ∧ψ\phi \land \psiϕ∧ψ. 这个规则写为 ∧e\wedge e∧e
前提是证明两个结论各自分别正确
合取消去规则 conjunctive elimination
在已知 ϕ∧ψ\phi \wedge \psiϕ∧ψ 的条件下有 ϕ\phiϕ 与 ψ\psiψ 各自成立,分别写作 ∧e1,∧e2\wedge e_1, \wedge e_2∧e1,∧e2
双重否定规则 double negative rule
对于双重否定我们可以得到其本身
蕴含消去规则 modus ponens ...
数列递归和矩阵
从斐波那契说起
对于斐波那契公式,我们有 an+1=an+an−1a_{n+1} = a_n + a_{n -1}an+1=an+an−1 那么我们可以写成矩阵形式:
[an+1an]=[1110][anan−1]\begin{bmatrix}a_{n+1}\\a_{n}\end{bmatrix} = \begin{bmatrix}1 &1\\1& 0\end{bmatrix}\begin{bmatrix}a_n\\a_{n -1}\end{bmatrix}
[an+1an]=[1110][anan−1]
设 vn+1=[an+1an]v_{n+1} = \begin{bmatrix}a_{n+1}\\a_n\end{bmatrix}vn+1=[an+1an] 且我们有 A=[1110]A = \begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}A=[1110]
那么应用递推我们得到的是 vn+k=Akvnv_{n + k} = A^k v_nvn+k=Akvn 我们自然而然就会想到 ...
基本结构:集合、函数、序列、求和、矩阵
集合
集合的特性
集合元素各不相同 distinct
对于多集合 multiset 是可以存在重复的集合内元素的
元素没有顺序区别 unordered
两种表示法可以相互转化 (枚举/描述)
基数 Cardinality
表示集合的尺寸,或者说集合内元素的数量
表示为 #A\#A#A 或者 ∣A∣|A|∣A∣ 或者 cardA\text{card}AcardA
集合之间的关系
包含(子集) Inclusion (subset)
符号: ⊆\subseteq⊆ 或者 ⊂\subset⊂
定义: A⊂B⇔∀x∈A→x∈BA\subset B \Leftrightarrow \forall x \in A\to x\in BA⊂B⇔∀x∈A→x∈B
不包含: ⊄\not\subset⊂ 或者 ⊈\not\subseteq⊆, 定义 ∃x∈A,x∄B⇒A⊈B\exists x \in A, x\not\exists B \Rightarrow A\not\subseteq B∃x∈A,x∃B⇒A⊆B
性质
A⊆AA\subseteq AA⊆A 集合包含自身
...
模板 template
容器 container
功能:包含一定数据或者对象,没有本质定义
多次重复的使用某些代码,对象是不同的数据类型,我们称其为 polymorphism 或者 polymorphic
因此我们需要使用一个叫做 template 的东西
模板 template
每一个模板只能使用一个数据类型的数据,但是模板可以有多种数据类型的应用。
这个的处理是将类型名称作为编译过程的一个参数,同时这是一个参数泛化的一个实现
实现代码如下:
12345template <class T> // 前面我们学过了,class 就是一种 ADT,或者说 c++ 就是将 type 认作是 ADT 的一种class List{// 在这里面我们可以用 T 表示任何数据类型 void foo(T a); // 但是 declaration 里并不需要 List<T>};
接下来我们需要讨论的就是每一个成员函数的定义了,如何实现?
1234// 每一个成员函数前面 (如果该函数用到了 template) 都要写 template 这一行template <class ...
类 class
面向对象程序设计 OOP
我们在过程性编程中,一定会存在以下问题:对象进行不同的操作,遵循一定的时间顺序。
我们还会发现用户和数据的交互方式有三种,初始化、更新和报告(就是我们所谓的用户接口)
OOP 的方法就是从用户的角度考虑对象,描述对象所允许的操作
抽象 abstract
基本类型解决的问题
决定数据对象需要的内存数量
决定如何解释内存中的位 (换言之就是解决编码问题,例如 long 和 float 的占用空间一样但是 编码方式不同
决定可以使用数据对象执行的操作和方法(比如 int 和 float 的计算方法不同)
类的使用
访问控制
一般访问私有变量是使用 成员函数 或者 友元函数
设计思路
一般类的设计尽可能将共有接口和实现细节分开,公有接口表示设计的抽象组件
封装 encapsulation
将实现细节 ( implementation ) 放在一起并且将他们于抽象分开的过程被称为封装
什么是接口 api ?
接口是一个共享框架,供两个系统共享的时候使用,类是一种公共接口, public 是使用类的程序
类和结构体
结构体的所有变量访问类型是 public
类的默认 ...
链表结构 linked-list
成因
优点
申请空间、释放空间相对于动态数组更加容易
缺点
获取链表中的元素写法相比数组更加复杂难搞
需要专门的迭代器进行获取
nullptr 和 NULL 的使用
在 C 语言中我们并没有 nullptr 的指针,这是 cpp 的新增特性。
在编译器看来,NULL 和 nullptr 在事实上都是 0 ,也就是说,我们可以通过 if(ptr) 来判断一个指针是不是 nullptr。
我们可以通过 cout 来获得这些 nullptr 指针的指向内容,代码如下:
123456int *a = nullptr;std::cout<<a<<std::endl; // 这里显示是 0std::cout<<*a<<std::endl; // 这是不被允许的,会显示 segmentation fault (core dumped)*a = 0; // 编译器会报错char *p = NULL;std::cout<< (p == (char * )a) <<std::endl; // 这里显示是真,说明这里的地址指 ...
280 复习
函数重载 function overloading
静态多态 static polymorphism: 在某个类内部的函数进行重载,在编译的时候生成
动态多态 dynamic polymorphism: 虚函数机制,在运行的时候进行重载,不同类
函数重载
定义:相同名称但是不同的参数数量或者参数的数据类型
规则:
默认参数应该放在参数的末尾
返回类型可以不同
要能区分不同的函数,不要有两个名称和数据类型、参数数量完全相同的函数出现
constructor 重载
destructor 重载
对于通过 new 方法申请内存空间的变量我们也要通过 delete 的方法删除,这时候我们就需要通过一个专门做这个的特殊函数 ~ 析构函数进行拆解删除
每次在类的生命周期结束的时候,会自动调用析构函数将变量 delete 掉
硬拷贝 Deep Copy
所谓深浅,区别在于对于指针的复制是按照地址复制还是内容复制,如果按照地址复制,在该代码块(函数)结束的时候会自动调用析构函数
三大法则 rule of big three
对于任何动态分配的内存,我们都必须提供:
析构函数 destructo ...
Untitled
解题模式
在线比赛,解出题目获得flag得分
攻防模式
现场比赛,存在快速攻击目标主机并且获取主机的权限
题目分类
web 安全
逆向工程 reverse
漏洞挖掘和漏洞利用 PWN
密码学 crypto
调查取证 misc
移动安全 mobile
练习网站
http://www.shiyanba.com/ctf/practice 易
http://ctf.bugku.com/login 易
https://www.ichunqiu.com/competition 难
Untitled
补天
https://loudong.360.cn
编程语言
php
java
工具
metasploit
nessus
nmap
awvs
Untitled
集合
集合的特性
集合元素各不相同
对于多集合 multiset 是可以存在重复的集合内元素的
元素没有顺序区别
两种表示法可以相互转化 (枚举/描述)
集合之间的关系
包含(子集) Inclusion (subset)
符号: ⊆\subseteq⊆ 或者 ⊂\subset⊂
定义: A⊂B⇔∀x∈A→x∈BA\subset B \Leftrightarrow \forall x \in A\to x\in BA⊂B⇔∀x∈A→x∈B
不包含: ⊄\not\subset⊂ 或者 ⊈\not\subseteq⊆, 定义 ∃x∈A,x∄B⇒A⊈B\exists x \in A, x\not\exists B \Rightarrow A\not\subseteq B∃x∈A,x∃B⇒A⊆B
性质
A⊆AA\subseteq AA⊆A 集合包含自身
若 A⊆BA \subseteq BA⊆B 且 A≠BA\not= BA=B 则 B⊈AB\not\subseteq AB⊆A: 这里定义了集合的等号 A=B⇔A⊆B∧B⊆AA = B \Left ...
