Dedukčního strom je strukturovaná reprezentace řešení úlohy.
Řešení úlohy je rozděleno na posloupnost jednoduchých kroků. Pořadí a návaznosti jednotlivých kroků definuje dedukčního strom, kde kroky jsou uzly stromu a vrchol stromu je konečný výsledek.
Podrobnosti a příklady, jak vytvořit dedukční strom zde
Příklad - slepičí hádanka
Parametrizace
Parametry dedukčního stromu může sloužit jako míra složitosti úlohy.
Predikáty
Predikáty umožňují formalní zápis situačního modelu úlohy.
Predikát | Vlastnosti | Příklad |
C container |
(agent=Ája, quantity=2, entity=sešity) |
Ája má 2 sešity |
COMP comparison |
(agentA=Ája, agentB=Honzík, quantity=7, entity=sešity) |
Ája má o 7 sešitů více než Honzík |
COMP RATIO comparison by ratio |
(agentA=Ája, agentB=Honzík, quantity=7, entity=sešity) |
Ája má 7 krát více sešitů než Honzík |
COMP ANGLE comparison between 2 angles |
(agentA=alfa, agentB=beta, relationship="complementary") |
Alfa je doplňkový úhel k beta. |
COMP DIFF comparison by difference |
(agentMinuend=celkem, agentSubtrahend=Honzík, quantity=7, entity=sešity) |
Rozdíl mezi sešity celkem a Honzíkem je 7 sešitů./td> |
TRANSFER transfer |
(agentSender=Ája, agentReceiver=Honzík, quantity=7, entity=sešity) |
Ája dala 7 sešitů Honzíkovi. |
RATIO part to whole comparison |
(whole={agent:třída,entity:žáci}, part=chlapci, ratio=1/4) |
Ve třídě je 1/4 chlapců ze všech žáků. |
RATIOS part to part comparison |
(whole={agent:třída,entity:žáci}, parts=[chlapci,dívky], ratios=[1,3]) |
Poměr chlapců a dívek ve třídě je 1:3 (1 chlapec ku 3 dívkám). |
RATE rate |
(agent=Ája, quantity=3, entity=Kč, entityBase=rohlík) |
Každý rohlík, který má Ája, stojí 3 Kč. |
QUOTE quote |
(agent=skupina, agent=dvojice, quantity=5) |
Skupina rozdělena na 5 dvojic. |
SUM sum |
(agentWhole=třída, partAgents=[chlapci,dívky], entityWhole=žáků) |
Počet chlapců a dívek dohromady dává počet žáků ve třídě. |
PRODUCT product |
(agentWhole=obsah obdélníku, partAgents=[šířka,délka], entityWhole=cm2) |
Obsah obdelníku je produktem výšky a šířky. |
PROPORTION proportion |
(inverse=true, entities=[počet výrobků, počet pracovníků]) |
Nepřímá úměra platí mezi veličinami počet výrobků a počet pracovníků. |
UNIT convert unit |
(unit=kg) | Převod na kg. |
GCD Greatest Common Divisor |
(agent=tyč, entity=délka (m)) |
Největší možná délka (m) tyče. |
LCD Least Common Denominator |
(agent=skupina, entity=osob) |
Nejmenší možná skupina osob. |
COMMON SENSE common sense |
(description=...) | Nepřímá uměrnost. Je vztah mezi veličinami, kde je obracený poměr veličin. |
Odvozovací pravidla
Porovnávání
Porovnání - o kolik je větší / menší?
COMP
Porovnání podílem - kolikrát je větší / menší?
COMP-RATIO
Porovnání rozdílem - kolik je rozdíl?
COMP-DIFF
Porovnávání - část z celku
RATIO
Porovnávání - poměry část ku časti
RATIOS
Porovnávání - úhly
COMP-ANGLE
Stav a změna stavu
TRANSFER
DELTA
Predikát
TRANSFER
není komutativní. Záleží na pořadí, které umožňuje representovat čas.
Rozdělování
RATE
QUOTA
10 : 2 = 5 může reprezentovat 2 různé věci
- 2 díly velikosti 5m - znám počet skupin 2, rozdělení 10m tyče na 2 díly o délce 5m - RATE
- 5 dílů velikosti 2m - znám velikost skupiny 2m, rozdělení 10m tyče po 2m na 5 dílů - QUOTA
Spojování
SUM
PRODUCT
Převod jednotek
UNIT
Nejmenší společný násobek
LCD
Největší společný dělitel
GCD
Posloupnosti
SEQUENCE
Aritmetická
Kvadratická
Geometrická
Základní odvozovací vzory
Procenta
Parametrizace
Výpočet procentní části
Výpočet základu
Výpočet procent
Úměrnosti
Přímá úměrnost
Parametrizace
Nepřímá úměrnost
Parametrizace
Kombinovaná přímá a nepřímá úměrnost
Parametrizace
Porovnávání
Porovnávání s absolutním rozdílem
Parametrizace
Porovnání s relativním rozdílem
Parametrizace
Parametrizace
Porovnání s absolutním a relativním rozdílem
Parametrizace
Porovnání části k celku
Parametrizace
Měřítko
Parametrizace
Tělesa
Kvádr
Parametrizace
Válec
Parametrizace
Trojboký hranol
Parametrizace
Jak je to uděláno?
Můžete použít jako javascript module.
<script type="module">
import {cont, inferenceRule} from "https://www.cermatdata.cz/components/math.js";
const result = inferenceRule(
cont("půjčka", 300, "Kč"),
inferenceRule(
cont("úrok", 20, "%"),
cont("půjčka", 100, "%"),
{ kind: 'ratio' }
)
);
//Výsledek: úrok = 60 Kč
console.log(`Výsledek: ${result.agent} = ${result.quantity} ${result.entity}`)
</script>
Dedukční strom
Obecný postup vytvoření dedukčního stromu ze zadání úlohy
- zadání úlohy je potřeba převést (text comprehension) na sadu predikátů (formalizované pravdivé tvrzení)
- použít odvozovací pravidla (inference rules)
- vstupem - seznam predikátů, resp. předpokladů (premises)
- výstupem - jeden predikát
- výsledek úlohy získáme průchodem stromu do hloubky (post-order), tj. aplikujeme odvozovací pravidla až poté, co známe všechny vstupy (premises)
Konkrétní příklad řešení pro zadání úlohy
import { comp, compRatio, nthPart, rate, ratios, sum } from "../../components/math.js";
import { axiomInput, deduce, last } from "../../utils/deduce-utils.js";
export function kytice() {
//agent names and entities
const kyticeAgent = "kytice";
const chryzatemaAgent = "chryzantéma";
const ruzeAgent = "růže";
const staticAgent = "statice";
const kusEntity = "kus";
const entity = "cena";
//axioms
const rozdilRuze = axiomInput(comp(ruzeAgent, staticAgent, 2, kusEntity), 1);
const RtoS = axiomInput(compRatio(ruzeAgent, staticAgent, 5 / 4), 2);
const CHxS = axiomInput(ratios(kyticeAgent, [chryzatemaAgent, staticAgent], [3, 2]), 3);
const ruzeRate = axiomInput(rate(chryzatemaAgent, 54, entity, kusEntity), 4)
const chryzantemaRate = axiomInput(rate(chryzatemaAgent, 40, entity, kusEntity), 5)
const staticeRate = axiomInput(rate(chryzatemaAgent, 35, entity, kusEntity), 6)
//deduction
const statice = deduce(
rozdilRuze,
RtoS
)
const chryzantem = deduce(
last(statice),
CHxS,
nthPart(chryzatemaAgent)
)
const ruze = deduce(
statice,
rozdilRuze
)
return {
deductionTree: deduce(
deduce(ruze, ruzeRate),
deduce(last(statice), staticeRate),
deduce(chryzantem, chryzantemaRate),
sum(kyticeAgent, [ruzeAgent, chryzatemaAgent, staticAgent], entity, entity)
)
}
}
Další příklady jsou zde
API
Predikáty (predicates)
export declare type Predicate = Container | Comparison | RatioComparison | Transfer | Rate | Combine | PartWholeRatio | PartToPartRatio | ComparisonDiff | CommonSense | GCD | LCD;
export declare function cont(agent: string, quantity: number, entity: string): Container;
export declare function comp(agentA: string, agentB: string, quantity: number, entity: string): Comparison;
export declare function compRatio(agentA: string, agentB: string, quantity: number, entity: string): RatioComparison;
export declare function compDiff(agentMinuend: string, agentSubtrahend: string, quantity: number, entity: string): ComparisonDiff;
export declare function ratio(whole: EntityMatcher, part: EntityMatcher, ratio: number): PartWholeRatio;
export declare function ratios(whole: EntityMatcher, parts: EntityMatcher[], ratios: number[]): PartToPartRatio;
export declare function sum(wholeAgent: string, partAgents: string[], wholeEntity: string, partEntity: string): Combine;
export declare function gcd(agent: string, entity: string): GCD;
export declare function lcd(agent: string, entity: string): LCD;
export declare function rate(agent: string, quantity: number, entity: string, entityBase: string): Rate;
export declare function commonSense(description: string): CommonSense;
Odvozovací pravidla (inference rules)
export declare function inferenceRule(a: Predicate | Container[], b: Predicate, c?: {
kind: 'ratio' | 'comp-ratio' | 'rate' | "comp-diff" | 'comp-part-eq';
})
Inspirováno prací MathGAP.