Algorithms Before Symbols: Verbal Procedures in Medieval Mathematics and the History of Algorithmic Reasoning

Last Updated June 23, 2026

Algorithms Before Symbols examines how medieval mathematics could be procedural before it became symbolic in the modern sense. Many mathematical rules were written in ordinary language, worked examples, diagrams, tables, recipes, and problem classifications rather than in compact algebraic notation. Yet these procedures could still be precise, repeatable, teachable, and computationally meaningful.

This article treats verbal procedure as a major root of algorithmic reasoning. Before equations were routinely written with symbolic variables, before modern function notation, before programming languages, and before automated computation, mathematical authors described operations in words. They told the reader what to do: take a number, multiply it, restore a term, balance a relation, divide by a quantity, complete a square, consult a table, interpolate between entries, check the result, or repeat a procedure for another case.

The point is not that medieval verbal mathematics was secretly modern code. It was not. The point is subtler and more important: algorithmic structure can exist before symbolic notation. A procedure can be expressed rhetorically. A problem can be classified verbally. A transformation can be justified geometrically. A calculation can be taught through examples. A sequence of operations can be made public, repeatable, and transmissible without modern algebraic syntax.

A restrained scholarly illustration of a medieval study with open manuscripts, verbal procedure pages, counting tokens, geometric diagrams, astronomical instruments, abacus-like tools, rulers, and parchment records representing algorithms before symbolic notation.
Algorithms before symbols shown through verbal procedures, counting practices, geometric diagrams, manuscript instructions, and stepwise mathematical reasoning before modern notation.

This article introduces verbal procedure, rhetorical algebra, medieval arithmetic recipes, rule-governed calculation, problem classification, unknown quantities before symbolic variables, worked examples, geometric demonstration, table lookup, interpolation, practical reckoning, Latin algorism, Islamic-world algebraic instruction, Sanskrit and Arabic mathematical prose, transmission through manuscripts, and the distinction between algorithmic structure and modern notation. It argues that algorithms should be studied not only as symbolic formulas or computer code, but also as public procedures written in language.

Why Verbal Procedures Matter

Verbal procedures matter because they show that algorithmic reasoning is older than modern notation. A method can be expressed in prose and still have input, transformation, order, condition, stopping point, and verification. The procedure may not look like code, but it can still tell a trained reader how to move from a problem to a result.

In medieval mathematics, verbal procedures were common. Arithmetic instructions, algebraic transformations, inheritance calculations, astronomical table rules, commercial reckoning methods, geometric demonstrations, and pedagogical examples often used language to guide action. The reader did not merely contemplate a theorem. The reader performed a sequence.

Why verbal procedures matter Historical meaning Algorithmic meaning
Procedure before notation Methods were written in words before modern symbolic conventions. Algorithms are not limited to formulas or code.
Teaching Rules and examples trained human calculators. Algorithms become curriculum.
Transmission Procedures moved through manuscripts, translations, and schools. Algorithms travel through language.
Practical use Commerce, inheritance, surveying, astronomy, and administration needed repeatable methods. Institutions rely on procedural calculation.
Correctness Examples and demonstrations justified methods. Procedure requires verification.
Historical humility Modern notation is powerful but not the only form of rigor. Formal structure can be expressed verbally.

Verbal mathematics is not a primitive failure to be symbolic. It is a historical form of procedural precision.

Back to top ↑

What It Means to Have Algorithms Before Symbols

“Algorithms before symbols” does not mean mathematics existed without signs, diagrams, numerals, or written marks. It means many procedures existed before the modern symbolic algebra familiar today. Medieval mathematical texts often used prose, named quantities, examples, tables, diagrams, and verbal rules instead of compact algebraic notation.

An algorithm before symbols is a repeatable method expressed in non-modern notation. It may say, in words, what to do with a quantity. It may describe a relation without using an equals sign. It may identify an unknown without calling it \(x\). It may give a worked example instead of a universal formula. It may demonstrate correctness with a geometric figure rather than symbolic proof.

Modern expectation Medieval procedural form Algorithmic continuity
Variables Unknowns described as things, roots, squares, shares, or quantities. Missing values become representable.
Equations Relations stated in prose. Quantities can be connected before symbolic notation.
Functions Rules for computing or tabulating values. Input-output structure can be verbal.
Programs Instructions to human calculators. Procedure can be executed by trained readers.
Formal proof Geometric, verbal, or example-based demonstration. Correctness can be justified in multiple media.
Documentation Manuscripts, commentaries, examples, and teaching rules. Procedure becomes transmissible.

Algorithms before symbols remind us that the history of computation is also a history of language.

Back to top ↑

Rhetorical Algebra and Mathematical Prose

Rhetorical algebra refers to algebra expressed largely in words rather than modern symbols. Early algebraic traditions often described unknowns, squares, roots, constants, operations, and transformations through prose. The method could still be systematic even if the notation was not symbolic in the modern sense.

Al-Khwārizmī’s algebraic tradition is a major example. Problems were classified, operations were explained, and solutions were demonstrated. The prose did procedural work: it told the reader how to identify the case, what operation to apply, and how to reach the answer.

Rhetorical feature Function in mathematics Computational role
Named unknown Allows missing quantity to be discussed. Defines a target state.
Verbal relation Describes how quantities connect. Represents problem structure.
Named operation Restoration, balancing, multiplication, division, extraction. Defines transformation rule.
Problem class Groups similar problems. Selects a procedure.
Worked example Shows the method in action. Provides executable pattern.
Demonstration Explains why the method works. Supports correctness.

Mathematical prose can be procedural when it gives a reader a reliable path through a problem.

Back to top ↑

Procedures Without Modern Variables

A variable is a compact symbolic tool, but the idea of an unknown does not require the modern letter \(x\). Medieval texts could speak of a root, a thing, a square, a share, a number, a quantity, or an unknown amount. The missing value was still part of the procedure.

The ability to reason about an unknown before knowing its value is central to algebra and computation. It lets a problem be represented before it is solved. It lets operations be applied to relations rather than only to known numbers. It lets a method move toward an output.

Without modern variables Procedural function Modern analogy
“The thing” Names an unknown quantity. Variable placeholder.
“The root” Identifies a value related to a square. Unknown or solution target.
“The square” Represents a second-degree quantity. Quadratic term.
“The share” Represents allocated part of a whole. Fractional or proportional variable.
“The remainder” Represents what remains after operation. State variable.
“The result” Marks the target output. Return value.

The absence of modern variables does not mean the absence of abstraction.

Back to top ↑

Problem Classification Before Formal Syntax

Many medieval procedures began by recognizing the type of problem. A question might involve a number and a root, a square and a number, a commercial rate, an inheritance share, a table lookup, or a geometric relation. Once the type was recognized, the method could be selected.

This is algorithmic because classification controls execution. A modern program branches by condition; a mathematical solver chooses a method by problem form. Medieval texts often encoded this logic in prose: if the problem has this structure, do this; if it has another structure, use that method.

Classification layer What it identifies Algorithmic effect
Arithmetic type Addition, subtraction, multiplication, division, extraction. Selects arithmetic operation.
Algebraic type Unknown, square, root, number, or relation among them. Selects equation-solving procedure.
Commercial type Price, rate, exchange, profit, debt, partnership. Selects reckoning method.
Inheritance type Shares, heirs, remainder, adjustment. Selects allocation procedure.
Table type Lookup, correction, interpolation, prediction. Selects tabular operation.
Geometric type Area, length, proportion, square, rectangle. Selects spatial demonstration.

Classification made procedure reusable because it turned particular problems into cases of a method.

Back to top ↑

Worked Examples as Algorithmic Infrastructure

Worked examples were a major form of algorithmic infrastructure. A text could show how to solve one problem, and that example could teach a general method. The reader learned not only the answer, but the sequence: identify quantities, perform operations, transform the relation, compute the result, and check it.

Examples are powerful because they preserve procedure in concrete form. They reduce abstraction enough to be teachable while still pointing beyond the individual case. A worked example functions like a sample run, a test case, and a pedagogical template.

Example component Pedagogical role Algorithmic role
Problem statement Introduces a concrete case. Defines input.
Identification of quantities Shows what matters. Parses state.
Procedure steps Teaches what to do. Executes algorithm.
Intermediate values Shows progress through calculation. Exposes state changes.
Answer Completes the case. Returns output.
Check or demonstration Validates the method. Tests correctness.

Worked examples are not merely illustrations. They are vehicles of procedural memory.

Back to top ↑

Geometric Demonstration and Verbal Correctness

Medieval mathematics often combined verbal procedure with geometric demonstration. A procedure might be described in words, then justified through a diagram of squares, rectangles, lines, or proportions. This mattered especially in algebraic contexts where completing the square or transforming a relation could be shown spatially.

Geometric demonstration reminds us that procedure and proof are not enemies. A calculation may produce a result, but a demonstration explains why the method works. In algorithmic terms, this is a correctness argument expressed through geometry and language rather than formal symbolic proof.

Demonstration element Mathematical function Computational lesson
Diagram Makes relations visible. Procedure can be inspected.
Square Represents squared quantity. Structure supports transformation.
Rectangle Represents product or mixed term. Terms can be decomposed.
Completion Shows how a missing part creates a known form. Transformation creates solvable structure.
Verbal explanation Guides interpretation of the figure. Documentation explains execution.
General method Extends beyond the specific diagram. Correctness supports reuse.

Correctness can be verbal, visual, numerical, or symbolic. Medieval mathematics often used several at once.

Back to top ↑

Table Lookup and Interpolation as Verbal Procedure

Astronomical, trigonometric, calendrical, and administrative tables required procedures for use. A table was not self-executing. The reader needed to know which column to consult, how to select a row, how to adjust for context, how to interpolate between entries, and how to combine results.

These procedures were often explained verbally. A table plus instructions forms a computational system: stored values, indexing rules, correction steps, and interpretive guidance.

Tabular operation Verbal instruction might say Algorithmic meaning
Lookup Find the entry corresponding to a given argument. Indexed access.
Interpolation Take the difference and proportion it between entries. Approximation rule.
Correction Add or subtract an adjustment for context. Calibration.
Combination Use multiple table values together. Composed computation.
Rounding Reduce or approximate the result to a usable form. Numerical convention.
Checking Compare against known values or alternative procedure. Validation.

A table becomes algorithmic when instructions tell the reader how to use it.

Back to top ↑

Practical Reckoning and Institutional Mathematics

Verbal procedures flourished in practical mathematics because institutions needed repeatable calculation. Merchants needed exchange, profit, partnership, and debt procedures. Legal systems needed inheritance and allocation procedures. Surveyors needed area and boundary procedures. Administrators needed taxation and accounting procedures. Astronomers needed table and prediction procedures.

These were not abstract curiosities. They were operating methods for real institutions. A procedure written in ordinary language could guide a trained person through a calculation that affected property, trade, timekeeping, land, ritual direction, or governance.

Institutional domain Verbal procedure Why it mattered
Commerce Rules for exchange, profit, partnership, and debt. Markets require repeatable calculation.
Inheritance Rules for shares, remainder, and adjustment. Legal allocation requires procedure.
Surveying Rules for area, boundary, and measurement. Land administration requires computation.
Astronomy Rules for tables, calendars, and prediction. Time and observation require calculation.
Education Rules and examples for students. Procedure becomes curriculum.
Administration Rules for tax, inventory, and accounting. Governance depends on numerical records.

Practical reckoning shows that algorithmic reasoning has always been tied to social organization.

Back to top ↑

Manuscripts, Teaching, and Transmission

Verbal procedures traveled through manuscripts, commentaries, translations, teaching lineages, marginal notes, exercises, and practical manuals. A procedure could be copied, abbreviated, expanded, corrected, adapted, translated, or reorganized. Transmission was not passive storage. It was intellectual work.

This matters because algorithms are not only invented; they are maintained. They survive through media, pedagogy, and institutions. A verbal rule can become durable when it is copied into teaching texts, explained by instructors, applied in practice, and adapted for new audiences.

Transmission medium What it does Algorithmic significance
Manuscript Preserves and circulates procedure. Stores algorithmic knowledge.
Commentary Explains, clarifies, or corrects method. Maintains procedure.
Translation Moves procedure across language. Transforms representation.
Teaching example Makes method learnable. Creates executable pattern.
Marginal note Adds clarification or local adaptation. Procedure evolves through use.
Practical manual Places method in institutional context. Algorithm enters work practice.

The history of algorithms is also a history of how procedures are copied, taught, and repaired.

Back to top ↑

From Verbal Rules to Symbolic Compression

Symbolic notation compresses mathematical language. A long verbal instruction can sometimes become a short formula. This compression is powerful: it enables abstraction, manipulation, proof, generalization, and later automation. But symbolic notation did not appear all at once, and it did not make earlier verbal methods meaningless.

The relationship between verbal and symbolic mathematics is not a simple replacement story. Symbols often grow out of repeated procedural needs. When many similar relations must be written, a shorthand becomes useful. When transformations become complex, notation helps track structure. When proofs become general, symbols increase precision and scale.

Verbal procedure Symbolic compression What changes
“Take the thing and multiply it by itself” \(x^2\) Repeated expression becomes compact.
“Add the same amount to both sides” \(A=B \Rightarrow A+C=B+C\) Transformation becomes general.
“Complete the square” \((x+b/2)^2\) Geometric procedure becomes algebraic form.
“Find the table entry and correct it” Lookup plus adjustment formula. Instruction becomes operation.
“Divide according to the shares” Ratio or fraction notation. Allocation becomes symbolic relation.
“Repeat for each place” Iterative notation or loop. Procedure becomes generalized iteration.

Symbols are powerful because they compress procedure, but the procedural imagination often comes first.

Back to top ↑

Why Verbal Does Not Mean Vague

A verbal mathematical procedure can be vague, but it does not have to be. Precision depends on whether the language defines a stable operation for trained readers. Medieval mathematical prose often used technical vocabulary, conventional examples, known problem types, and established operations.

The reader’s training mattered. A phrase that seems ambiguous to a modern outsider may have been clear within a mathematical tradition. This is similar to how modern code depends on language conventions, libraries, syntax, and shared expectations. Procedure always depends on an interpretive community.

Source of precision How it works Computational analogy
Technical vocabulary Words have specialized mathematical meanings. Reserved terms.
Problem classes Readers recognize standard forms. Type or pattern recognition.
Worked examples Examples show how rules operate. Test cases.
Diagrams Visual forms constrain interpretation. Structured representation.
Teaching tradition Instruction standardizes reading. Documentation and training.
Correction practice Errors are discovered through checking. Debugging and validation.

Verbal procedure is rigorous when it belongs to a disciplined practice of reading, teaching, and checking.

Back to top ↑

Modern Computational Lessons

Modern computation can learn several lessons from algorithms before symbols. First, representation matters. A procedure depends on how inputs are named, organized, and transformed. Second, documentation matters. A procedure must be readable and executable by someone or something. Third, examples matter. They teach, test, and reveal edge cases. Fourth, verification matters. A procedure is not complete until its result can be checked.

The most important lesson is that algorithmic thinking is not identical with programming. Programming is one modern form of algorithmic expression. Verbal mathematical procedure is another historical form. Both require ordered operations, interpretation, constraints, and correctness.

Modern lesson Medieval precedent Why it matters now
Readable procedure Verbal instructions for human calculators. Code and models need documentation.
Test cases Worked examples. Examples reveal whether the method works.
Representation design Unknowns, tables, diagrams, numerals, and prose. Data structure shapes computation.
Case classification Problem types before symbolic syntax. Correct method depends on problem form.
Correctness argument Geometric and verbal demonstration. Outputs require justification.
Transmission Manuscripts, translations, teaching, and adaptation. Algorithms persist through institutions.

The history of verbal procedures widens our view of what algorithmic reasoning can be.

Back to top ↑

Origin Stories and Careful Interpretation

Algorithms before symbols should not be turned into a simplistic origin story. Verbal procedures appeared in many mathematical traditions: Babylonian problem texts, Greek geometric reasoning, Sanskrit mathematical rules, Arabic algebra and arithmetic, Latin algorism, Chinese mathematical procedures, and many practical reckoning traditions. The point is not to rank them as if one culture owns procedure. The point is to understand how procedures were expressed, taught, and transmitted.

Careful interpretation also avoids judging earlier mathematics only by modern notation. A medieval text may look wordy because it does not use symbols we now take for granted. But wordiness is not the same as conceptual weakness. The verbal form may reveal pedagogical, practical, and demonstrative priorities that symbolic compression hides.

Oversimplification Problem Better framing
Algorithms began with modern computers. It ignores long histories of procedure. Study pre-computer mathematical methods.
Verbal mathematics is not rigorous. It confuses notation with precision. Evaluate procedure in its own technical context.
Symbols replaced words completely. It ignores continuing need for explanation. Symbols and language work together.
One tradition invented procedure. It erases multiple lineages. Trace many procedural cultures.
Examples are secondary. It misses their procedural role. Treat examples as method carriers.
Transmission is passive. It ignores translation, teaching, and adaptation. Study movement as intellectual work.

A careful history of algorithms before symbols shows procedure as a shared human achievement expressed in many media.

Back to top ↑

Examples of Algorithms Before Symbols

The examples below show how verbal procedures in medieval mathematics can be understood as algorithmic reasoning.

Rhetorical algebra

Unknowns, squares, roots, and numbers are described in words rather than modern symbols.

Restoration and balancing

Algebraic transformations are named and explained as operations on a relation.

Worked arithmetic recipes

A rule tells the reader how to multiply, divide, carry, borrow, or extract.

Problem classification

A text tells the reader which kind of problem is being solved before giving the procedure.

Geometric completion

A diagram shows why a square or rectangle operation makes the method valid.

Table instructions

A rule explains how to find, interpolate, correct, and interpret a tabular value.

Commercial reckoning

Verbal rules guide exchange, debt, profit, partnership, and allocation calculations.

Manuscript transmission

Copying, commentary, translation, and teaching preserve and reshape procedures.

Across these examples, algorithmic reasoning appears as disciplined, repeatable instruction before modern symbolic syntax.

Back to top ↑

Mathematics, Computation, and Modeling

A verbal procedure can be modeled as a sequence:

\[
Instruction_1 \rightarrow Instruction_2 \rightarrow \cdots \rightarrow Result
\]

Interpretation: A procedure can be ordered even when the instructions are written in prose.

A problem-classification rule can be modeled as:

\[
Problem\ Form \rightarrow Procedure\ Choice
\]

Interpretation: Recognizing the type of problem selects the method to apply.

A worked example functions like:

\[
Input \rightarrow Intermediate\ States \rightarrow Output \rightarrow Check
\]

Interpretation: Examples show the path of execution, not only the final answer.

A transmission model can be written as:

\[
Procedure + Language + Example + Medium + Teacher \rightarrow Transmitted\ Method
\]

Interpretation: Procedures survive through language, examples, media, and instruction.

These formulas use modern notation to describe historical structure. They are interpretive models, not claims that medieval authors wrote in this form.

Back to top ↑

Python Workflow: Verbal Procedure Map

The Python workflow below creates a dependency-light interpretive map of algorithms before symbols. It scores themes by procedural clarity, representational dependence, pedagogical value, transmission importance, practical use, and modern resonance, then writes reproducible CSV and JSON outputs.

# algorithms_before_symbols_verbal_procedure_map.py
# Dependency-light workflow for mapping verbal procedures in medieval mathematics.

from __future__ import annotations

from dataclasses import asdict, dataclass
from pathlib import Path
from statistics import mean
import csv
import json
from datetime import datetime, timezone

ARTICLE_ROOT = Path(__file__).resolve().parents[1]
TABLES = ARTICLE_ROOT / "outputs" / "tables"
JSON_DIR = ARTICLE_ROOT / "outputs" / "json"


@dataclass(frozen=True)
class VerbalProcedureConfig:
    article: str = "algorithms_before_symbols_verbal_procedures_in_medieval_mathematics"
    core_threshold: float = 0.80
    high_procedural_clarity_threshold: float = 0.86


def timestamp_utc() -> str:
    return datetime.now(timezone.utc).isoformat()


def write_csv(path: Path, rows: list[dict[str, object]]) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    if not rows:
        path.write_text("", encoding="utf-8")
        return
    fieldnames = sorted({key for row in rows for key in row.keys()})
    with path.open("w", newline="", encoding="utf-8") as handle:
        writer = csv.DictWriter(handle, fieldnames=fieldnames, extrasaction="ignore")
        writer.writeheader()
        writer.writerows(rows)


def write_json(path: Path, payload: object) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8")


def verbal_procedure_themes() -> list[dict[str, object]]:
    return [
        {"theme_id": "rhetorical_algebra", "procedural_clarity": 0.90, "representation_dependence": 0.86, "pedagogical_value": 0.88, "transmission_importance": 0.90, "practical_use": 0.82, "modern_resonance": 0.88},
        {"theme_id": "problem_classification", "procedural_clarity": 0.92, "representation_dependence": 0.82, "pedagogical_value": 0.90, "transmission_importance": 0.84, "practical_use": 0.86, "modern_resonance": 0.90},
        {"theme_id": "worked_examples", "procedural_clarity": 0.94, "representation_dependence": 0.82, "pedagogical_value": 0.96, "transmission_importance": 0.90, "practical_use": 0.88, "modern_resonance": 0.86},
        {"theme_id": "geometric_demonstration", "procedural_clarity": 0.84, "representation_dependence": 0.92, "pedagogical_value": 0.88, "transmission_importance": 0.82, "practical_use": 0.78, "modern_resonance": 0.86},
        {"theme_id": "table_lookup_interpolation", "procedural_clarity": 0.88, "representation_dependence": 0.90, "pedagogical_value": 0.84, "transmission_importance": 0.86, "practical_use": 0.92, "modern_resonance": 0.90},
        {"theme_id": "commercial_reckoning_rules", "procedural_clarity": 0.88, "representation_dependence": 0.82, "pedagogical_value": 0.86, "transmission_importance": 0.84, "practical_use": 0.96, "modern_resonance": 0.84},
        {"theme_id": "manuscript_commentary_transmission", "procedural_clarity": 0.78, "representation_dependence": 0.86, "pedagogical_value": 0.88, "transmission_importance": 0.96, "practical_use": 0.82, "modern_resonance": 0.84},
    ]


def score_theme(row: dict[str, object], config: VerbalProcedureConfig) -> dict[str, object]:
    verbal_score = mean([
        float(row["procedural_clarity"]),
        float(row["representation_dependence"]),
        float(row["pedagogical_value"]),
        float(row["transmission_importance"]),
        float(row["practical_use"]),
        float(row["modern_resonance"]),
    ])

    if verbal_score >= config.core_threshold and float(row["procedural_clarity"]) >= config.high_procedural_clarity_threshold:
        interpretive_status = "core_verbal_procedure_thread"
    elif verbal_score >= config.core_threshold:
        interpretive_status = "major_verbal_procedure_thread"
    else:
        interpretive_status = "supporting_verbal_procedure_thread"

    return {
        "theme_id": row["theme_id"],
        "procedural_clarity": round(float(row["procedural_clarity"]), 6),
        "representation_dependence": round(float(row["representation_dependence"]), 6),
        "pedagogical_value": round(float(row["pedagogical_value"]), 6),
        "transmission_importance": round(float(row["transmission_importance"]), 6),
        "practical_use": round(float(row["practical_use"]), 6),
        "modern_resonance": round(float(row["modern_resonance"]), 6),
        "verbal_procedure_score": round(verbal_score, 6),
        "interpretive_status": interpretive_status,
    }


def interpretation_cautions() -> list[dict[str, str]]:
    return [
        {"caution": "do_not_confuse_verbal_with_vague", "meaning": "Verbal procedure can be precise within a technical tradition."},
        {"caution": "do_not_project_modern_symbols_backward", "meaning": "Medieval procedures should not be judged only by modern symbolic notation."},
        {"caution": "do_not_equate_procedure_with_programming", "meaning": "Pre-modern mathematical procedures are algorithmic without being computer code."},
        {"caution": "do_not_ignore_examples", "meaning": "Worked examples often carry the general method."},
        {"caution": "do_not_make_transmission_passive", "meaning": "Manuscripts, translations, commentaries, and teaching reshape procedure."},
    ]


def main() -> None:
    config = VerbalProcedureConfig()
    themes = verbal_procedure_themes()
    scored = [score_theme(row, config) for row in themes]
    cautions = interpretation_cautions()

    summary = {
        "article": config.article,
        "timestamp_utc": timestamp_utc(),
        "themes_reviewed": len(scored),
        "core_threads": sum(1 for row in scored if row["interpretive_status"] == "core_verbal_procedure_thread"),
        "major_threads": sum(1 for row in scored if row["interpretive_status"] == "major_verbal_procedure_thread"),
        "supporting_threads": sum(1 for row in scored if row["interpretive_status"] == "supporting_verbal_procedure_thread"),
        "mean_verbal_procedure_score": round(mean(float(row["verbal_procedure_score"]) for row in scored), 6),
        "cautions": len(cautions),
        "interpretation": "Algorithms before symbols should be studied as verbal, pedagogical, representational, practical, and transmissible procedures rather than as modern code projected backward.",
    }

    write_csv(TABLES / "verbal_procedure_themes.csv", themes)
    write_csv(TABLES / "verbal_procedure_map.csv", scored)
    write_csv(TABLES / "interpretation_cautions.csv", cautions)
    write_csv(TABLES / "verbal_procedure_summary.csv", [summary])

    write_json(JSON_DIR / "verbal_procedure_config.json", asdict(config))
    write_json(JSON_DIR / "verbal_procedure_map.json", scored)
    write_json(JSON_DIR / "interpretation_cautions.json", cautions)
    write_json(JSON_DIR / "verbal_procedure_summary.json", summary)

    print("Algorithms before symbols verbal procedure map complete.")
    print(TABLES / "verbal_procedure_summary.csv")


if __name__ == "__main__":
    main()

This workflow turns verbal mathematical procedure into a reproducible interpretive artifact: procedural clarity, representation, pedagogy, transmission, practical use, modern resonance, verbal procedure score, and historical caution are documented together.

Back to top ↑

R Workflow: Verbal Procedure Diagnostics

The R workflow reads the generated CSV outputs, summarizes verbal procedure themes, visualizes theme dimensions, and writes an additional diagnostic table.

# algorithms_before_symbols_verbal_procedure_summary.R
args <- commandArgs(trailingOnly = FALSE)
file_arg <- grep("^--file=", args, value = TRUE)

if (length(file_arg) > 0) {
  script_path <- normalizePath(sub("^--file=", "", file_arg[1]), mustWork = TRUE)
  article_root <- normalizePath(file.path(dirname(script_path), ".."), mustWork = TRUE)
} else {
  article_root <- getwd()
}

setwd(article_root)

tables_dir <- file.path(article_root, "outputs", "tables")
figures_dir <- file.path(article_root, "outputs", "figures")
dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE)
dir.create(figures_dir, recursive = TRUE, showWarnings = FALSE)

map_path <- file.path(tables_dir, "verbal_procedure_map.csv")
summary_path <- file.path(tables_dir, "verbal_procedure_summary.csv")

if (!file.exists(map_path)) {
  stop(paste("Missing", map_path, "Run the Python workflow first."))
}

verbal_map <- read.csv(map_path, stringsAsFactors = FALSE)
summary <- read.csv(summary_path, stringsAsFactors = FALSE)

png(file.path(figures_dir, "verbal_procedure_dimensions.png"), width = 1200, height = 850)
score_matrix <- t(as.matrix(verbal_map[, c("procedural_clarity", "representation_dependence", "pedagogical_value", "transmission_importance", "practical_use", "modern_resonance")]))
barplot(score_matrix,
        beside = TRUE,
        names.arg = verbal_map$theme_id,
        las = 2,
        ylim = c(0, 1),
        ylab = "Interpretive Score",
        main = "Algorithms Before Symbols: Verbal Procedure Dimensions")
legend("bottomright",
       legend = rownames(score_matrix),
       cex = 0.72,
       bty = "n")
grid()
dev.off()

png(file.path(figures_dir, "verbal_procedure_score_by_theme.png"), width = 1000, height = 750)
barplot(verbal_map$verbal_procedure_score,
        names.arg = verbal_map$theme_id,
        las = 2,
        ylab = "Verbal Procedure Score",
        main = "Verbal Procedure Score by Theme")
grid()
dev.off()

r_summary <- data.frame(
  themes_reviewed = summary$themes_reviewed[1],
  core_threads = summary$core_threads[1],
  major_threads = summary$major_threads[1],
  supporting_threads = summary$supporting_threads[1],
  mean_verbal_procedure_score = summary$mean_verbal_procedure_score[1],
  cautions = summary$cautions[1],
  diagnostic_note = "Algorithms before symbols should be studied as verbal, pedagogical, representational, practical, and transmissible procedures rather than as modern code projected backward."
)

write.csv(r_summary, file.path(tables_dir, "r_verbal_procedure_diagnostic_summary.csv"), row.names = FALSE)
print(r_summary)

The R layer makes the interpretive structure visible: rhetorical algebra, problem classification, worked examples, geometric demonstration, table lookup, practical reckoning, manuscript transmission, and caution can be examined as related but distinct dimensions of verbal procedure.

Back to top ↑

GitHub Repository

The companion repository contains reproducible workflows, synthetic interpretive data, outputs, calculators, documentation, and multilingual examples for this article.

Back to top ↑

A Practical Method for Studying Verbal Procedures

A procedural study of medieval mathematical prose should ask how the words tell the reader what to do. The goal is not to translate everything immediately into modern notation. The goal is to understand the procedure in its historical medium.

Step Historical action Output
1 Identify the problem type and practical or theoretical context. Case record.
2 List the named quantities, unknowns, relations, and operations. Representation map.
3 Extract the ordered verbal instructions. Procedure sequence.
4 Track intermediate states and transformations. State map.
5 Identify examples, diagrams, or tables that support the rule. Evidence layer.
6 Determine how the method is checked or justified. Correctness record.
7 Trace copying, translation, teaching, or adaptation. Transmission map.
8 Compare with modern symbolic notation only after the historical procedure is understood. Interpretive bridge.

This method respects verbal mathematics as a serious medium of procedural reasoning.

Back to top ↑

Common Pitfalls

The biggest mistake is to treat verbal procedure as vague simply because it lacks modern notation. Another mistake is to translate everything into symbols too quickly, losing the pedagogical and procedural structure of the original text. A third mistake is to describe verbal procedures as computer programs, which projects modern technology backward.

Pitfall Why it matters Better practice
Confusing verbal with vague It ignores technical vocabulary and trained reading. Ask whether the rule was precise within its tradition.
Projecting modern notation backward It distorts historical form. Study prose, examples, and diagrams first.
Calling medieval procedure “code” It collapses historical difference. Use “algorithmic structure” or “procedural reasoning.”
Ignoring worked examples It misses how methods were taught. Treat examples as procedural carriers.
Ignoring transmission It treats procedure as isolated text. Study copying, translation, commentary, and teaching.
Assuming symbols are always superior It hides the explanatory power of language. Compare media by function, not by modern preference.

A better reading treats verbal procedures as disciplined mathematical instructions.

Back to top ↑

Why Algorithms Before Symbols Matter

Algorithms before symbols matter because they show that procedure is deeper than notation. A method can be written in words, demonstrated in geometry, preserved in examples, organized by problem type, stored in tables, and transmitted through manuscripts before it becomes symbolic or programmable.

This history expands the meaning of algorithmic reasoning. It reminds us that computation is not only machine execution. It is also the human practice of making operations explicit, repeatable, teachable, inspectable, and correctable. Medieval verbal mathematics belongs in this history because it made procedures public long before modern symbolic algebra and programming languages.

The lesson for modern computation is not nostalgia. It is clarity: notation matters, but explanation matters too. A procedure that cannot be understood, taught, checked, or transmitted is fragile. Algorithms before symbols remind us that the first interface of computation was often language. AI belongs in the toolkit, not in control.

Back to top ↑

Back to top ↑

Further Reading

  • Berggren, J.L. (1986) Episodes in the Mathematics of Medieval Islam. New York: Springer.
  • Rashed, R. (2009) Al-Khwārizmī: The Beginnings of Algebra. London: Saqi Books.
  • Oaks, J.A. (2007) ‘Medieval Arabic algebra as an artificial language’, Journal of the American Oriental Society, 127(3), pp. 285–304.
  • Oaks, J.A. (2009) ‘Polynomials and equations in Arabic algebra’, Archive for History of Exact Sciences, 63(2), pp. 169–203.
  • Høyrup, J. (2002) Lengths, Widths, Surfaces: A Portrait of Old Babylonian Algebra and Its Kin. New York: Springer.
  • Katz, V.J. (1998) A History of Mathematics: An Introduction. 2nd edn. Reading, MA: Addison-Wesley.
  • Smith, D.E. and Karpinski, L.C. (1911) The Hindu-Arabic Numerals. Boston: Ginn and Company.

Back to top ↑

References

  • Berggren, J.L. (1986) Episodes in the Mathematics of Medieval Islam. New York: Springer.
  • Høyrup, J. (2002) Lengths, Widths, Surfaces: A Portrait of Old Babylonian Algebra and Its Kin. New York: Springer.
  • Katz, V.J. (1998) A History of Mathematics: An Introduction. 2nd edn. Reading, MA: Addison-Wesley.
  • Oaks, J.A. (2007) ‘Medieval Arabic algebra as an artificial language’, Journal of the American Oriental Society, 127(3), pp. 285–304.
  • Oaks, J.A. (2009) ‘Polynomials and equations in Arabic algebra’, Archive for History of Exact Sciences, 63(2), pp. 169–203.
  • O’Connor, J.J. and Robertson, E.F. (1999) ‘Abu Ja’far Muhammad ibn Musa Al-Khwarizmi’. MacTutor History of Mathematics Archive, University of St Andrews. Available at: https://mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi/.
  • Rashed, R. (2009) Al-Khwārizmī: The Beginnings of Algebra. London: Saqi Books.
  • Smith, D.E. and Karpinski, L.C. (1911) The Hindu-Arabic Numerals. Boston: Ginn and Company. Available at: https://www.gutenberg.org/files/22599/22599-h/22599-h.htm.

Back to top ↑

Scroll to Top