дуже корисний для вилучення програми, оскільки дозволяє видалити непотрібні частини коду. Наприклад, щоб витягти алгоритм сортування ми доведемо твердження «для кожного списку л є список до такимщо до замовлена і до є permutatiom з л ». Якщо ми запишемо це в Coq і витягнемо, не використовуючи P r o p , отримаємо:PropℓkkkℓProp
- "для всіх є k " дасть нам карту, яка бере списки до списків,ℓk
sort
- "такий, що замовлений", дасть функціонал, який проходить через k і перевірить, чи він відсортований, іk
verify
k
- " - перестановка ℓ " дасть перестановку, яка приймає ℓ до k . Зауважте, що це не просто відображення, а й обернене відображення разом з програмами, які підтверджують, що ці дві карти дійсно є оберненими.kℓ
pi
ℓkpi
Незважаючи на те, що зайві речі не є абсолютно марними, у багатьох програмах ми хочемо позбутися від них і просто тримати sort
. Це може бути досягнуто, якщо ми використовуємо для твердження " k впорядковано" і " k - перестановка ℓ ", але не "для всіх ℓ є k ".Propkkℓℓk
Загалом, поширеним способом вилучення коду є розгляд твердження форми де x є вхід, y - вихід, а ϕ ( x , y ) пояснює, що для y означаєправильний вихід. (В наведеному вище прикладіі В є типами списків і ф ( л , до ) є « до замовлено і до перестановці л .») Якщо φ в Р г про р , то витяг дає відображення F :∀x:A.∃y:B.ϕ(x,y)xyϕ(x,y)yABϕ(ℓ,k)kkℓϕProp такийщо φ ( х , е ( х ) ) виконується для всіх х ∈ . Якщо ϕ в S e t, то ми також отримаємо функцію g таку, що g ( x ) є доказом того, що ϕ ( x , f ( x ) ) є для всіх x ∈ Af:A→Bϕ(x,f(x))x∈AϕSetgg(x)ϕ(x,f(x))x∈A. Часто доказ обчислювально марний, і ми вважаємо за краще позбутися його, особливо коли він вкладений глибоко всередині якогось іншого твердження. дає нам можливість це зробити.Prop
Додано 29.07.2015: Існує питання, чи не могли б ми взагалі уникнути , автоматично оптимізуючи «непотрібний витягнутий код». В якійсь мірі ми можемо це зробити, наприклад, весь код, витягнутий з негативного фрагмента логіки (речі, побудовані з порожнього типу, тип одиниці, продукти), марний, оскільки він просто переміщується навколо одиниці. Але є справжні дизайнерські рішення, які треба приймати, використовуючи P r o p . Ось простий приклад, де Σ означає, що ми перебуваємо в T y p e, а ∃ означає, що ми перебуваємо в P r o p . Якщо ми витягуємо з
PropPropΣType∃Prop
ми отримаємо програму, яка розкладає n на найнижчий біт b, а решта біт k , тобто вона обчислює все. Якщо дістати з
Π n : N Σ b : { 0 , 1 } ∃ k : N
Πn:NΣb:{0,1}Σk:Nn=2⋅k+b
nbk
тоді програма обчислить лише найменший біт
b . Машина не може сказати, що є правильним, користувач повинен сказати їй, що він хоче.
Πn:NΣb:{0,1}∃k:Nn=2⋅k+b
b