-2 - 逻辑的边界
(Press ? for help, n and p for next and previous slide)
若 \(\Gamma\) 是一个 wff 集合,那么 \(\Gamma\) 中的一个推导是一个 wff 有穷序列 \(\langle\alpha_1, \ldots,\alpha_n \rangle\),对任意 \(i\leq n\) 有下面三者之一成立:
所以乘法可以写成: \[ \text{MUL}\equiv\lambda m.\lambda n.\lambda f.\lambda x. m\;(n\;f)\;x \] 解释:
在 λ 演算里,所有函数都是匿名的,没有“直接调用自己”的方式,但是递归需要函数能“看到自己”。
递归生成函数:
阶乘(递归函数): \[ \text{FACT}=Y\; F \]
等价模型: General Recursive Functions (Gödel), Lambda Calculus (Church), 算盘机 (胡海星;宋方敏), etc.
一个函数 \(f\)(在某个定义域 \(D\) 上的全函数)是能行可判定的当且仅当存在一个算法,对任意 \(o\in D\) 都可以在有穷步数内计算出 \(f(o)\)
一个性质 \(P\)(在某个论域 \(D\) 上定义)是能行可判定的当且仅当存在一个算法,在有穷步数内可判断任意 \(o\in D\) 满足或不满足性质 \(P\)
% Binary summation
start_binary_add :-
    string_chars("1011+11001", TapeChars),
    run(right, 0, TapeChars).
start_binary_add(S) :-
    string_chars(S, TapeChars),
    run(right, 0, TapeChars).
% UTM
run(done, _, Tape) :-
    format("*** Machine has halted. Final tape: ~w~n", [Tape]),
    !.
run(State, Pos, Tape) :-
    read_sym(Tape, Pos, Sym),
    transition(State, Sym, NewState, WriteSym, MoveDir),
    write_sym(Tape, Pos, WriteSym, TempTape, PosAfterWrite),
    move_pos(PosAfterWrite, MoveDir, NextPos),
    format("State=~w, Read=~w, Write=~w, Move=~w, NewState=~w, Tape=~w~n",
           [State, Sym, WriteSym, MoveDir, NewState, TempTape]),
    run(NewState, NextPos, TempTape).
read_sym(Tape, Pos, Sym) :-
    Pos >= 0,
    length(Tape, Len),
    Pos < Len,
    nth0(Pos, Tape, Sym), !.
read_sym(_, _, '_').
write_sym(Tape, Pos, Val, NewTape, NewPos) :-
    Pos >= 0,
    length(Tape, Len),
    Pos < Len,
    replace_nth0(Tape, Pos, Val, NewTape),
    NewPos = Pos, !.
write_sym(Tape, Pos, Val, [Val|Tape], 0) :-
    Pos < 0, !.
write_sym(Tape, Pos, Val, NewTape, Pos) :-
    Pos >= 0,
    length(Tape, Len),
    Pos >= Len,
    Extra is Pos - Len,
    make_blanks(Extra, Blanks),
    append(Tape, Blanks, Tmp),
    append(Tmp, [Val], NewTape), !.
replace_nth0([_|T], 0, New, [New|T]).
replace_nth0([H|T], I, New, [H|R]) :-
    I > 0,
    I1 is I - 1,
    replace_nth0(T, I1, New, R).
make_blanks(0, []) :- !.
make_blanks(N, ['_' | R]) :-
    N > 0,
    N1 is N - 1,
    make_blanks(N1, R).
move_pos(Pos, left,  NewPos) :- NewPos is Pos - 1.
move_pos(Pos, right, NewPos) :- NewPos is Pos + 1.
move_pos(Pos, stay,  Pos).
% Instructions
transition(right, '0', right, '0', right).
transition(right, '1', right, '1', right).
transition(right, '+', right, '+', right).
transition(right, '_', read, '_', left).
transition(read, '0', have0, 'c', left).
transition(read, '1', have1, 'c', left).
transition(read, '+', rewrite, '_', left).
transition(have0, '0', have0, '0', left).
transition(have0, '1', have0, '1', left).
transition(have0, '+', add0, '+', left).
transition(have1, '0', have1, '0', left).
transition(have1, '1', have1, '1', left).
transition(have1, '+', add1, '+', left).
transition(add0, '0',  back0, 'O', right).
transition(add0, '_',  back0, 'O', right).
transition(add0, '1',  back0, 'I', right).
transition(add0, 'O',  add0, 'O', left).
transition(add0, 'I',  add0, 'I', left).
transition(add1, '0',  back1, 'I', right).
transition(add1, '_',  back1, 'I', right).
transition(add1, '1',  carry, 'O', left).
transition(add1, 'O',  add1, 'O', left).
transition(add1, 'I',  add1, 'I', left).
transition(carry, '0',  back1, '1', right).
transition(carry, '_',  back1, '1', right).
transition(carry, '1',  carry, '0', left).
transition(back0, '0',  back0, '0', right).
transition(back0, '1',  back0, '1', right).
transition(back0, 'O',  back0, 'O', right).
transition(back0, 'I',  back0, 'I', right).
transition(back0, '+',  back0, '+', right).
transition(back0, 'c',  read,   '0', left).
transition(back1, '0',  back1, '0', right).
transition(back1, '1',  back1, '1', right).
transition(back1, 'O',  back1, 'O', right).
transition(back1, 'I',  back1, 'I', right).
transition(back1, '+',  back1, '+', right).
transition(back1, 'c',  read,   '1', left).
transition(rewrite, 'O', rewrite, '0', left).
transition(rewrite, 'I', rewrite, '1', left).
transition(rewrite, '0', rewrite, '0', left).
transition(rewrite, '1', rewrite, '1', left).
transition(rewrite, '_', done,    '_', right).
实质蕴涵(material implication, \(\rightarrow\))的问题: