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 between 2 agents |
(agentSender=Ája, agentReceiver=Honzík, quantity=7, entity=sešity) |
Ája dala 7 sešitů Honzíkovi. |
DELTA delta |
(agent=Ája, quantity=7, entity=sešity) |
Ája změna v čase o 7 sešitů. |
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ů. |
COMPLEMENT complement part of the whole |
Pokud je ve třídě je 1/4 chlapců ze všech žáků, tak doplněk znamená, že ve tříde je 3/4 dívek 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). |
SCALE part to part scaling |
Pokud je poměr chlapců a dívek ve třídě je 1:3, tak dvojnásobné rozšíření poměru je 2:6. | |
INVERT-SCALE part to part scaling |
Pokud je poměr chlapců a dívek ve třídě je 2:6, tak dvojnásobné zkrácení poměru je 1:3. | |
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
COMPLEMENT
Porovnávání - poměry část ku časti
RATIOS
SCALE
INVERT-SCALE
Porovnávání - úhly
COMP-ANGLE
Stav a změna stavu
DELTA
TRANSFER
Predikát
DELTA
, 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
Výrazy
EVAL-EXPR
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
Porovnání více hodnot
Parametrizace
Porovnání A/B a porovnání B/C
Porovnání A/B a porovnání C/B
Porovnání B/A a porovnání B/C
Porovnání B/A a porovnání C/B
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.