Question bank generator using propositional calculus
Project description
Genera variantes de preguntas de opción múltiple cuyas respuestas correctas se determinan automáticamente mediante cálculo proposicional. Combina supuestos e ítems de respuesta por combinatoria, calcula la veracidad o falsedad de cada ítem según las hipótesis activas y exporta el resultado a LaTeX (AMC) o Moodle (XML vía LaTeX).
Construido sobre calcprop.
Instalación
pip install calcprop calcprop-qbank
Con soporte para el editor visual en Jupyter:
pip install "calcprop-qbank[jupyter]"
Uso rápido
from qbank import *
p = ProblemaTipo([
"Dado que ",
[
Supuesto("$\\mathcal{A}$ es verdadero, ", v("A")),
Supuesto("$\\mathcal{B}$ es verdadero, ", v("B")),
],
"indique qué opción es correcta: ",
[
Cuestion("$\\mathcal{A}$ es verdadero.", v("A")),
Cuestion("$\\mathcal{B}$ es verdadero.", v("B")),
],
])
for etiqueta, enunciado, cuestiones in p:
print(f"Variante {etiqueta}: {enunciado}")
for texto, correcto, activa, exp in cuestiones:
print(f" {'✓' if correcto else '✗'} {texto}")
Características
Generación combinatoria de variantes
ProblemaTipo toma una lista de supuestos y cuestiones (cada uno con su
semántica proposicional) y genera todas las combinaciones posibles. Para
cada variante calcula automáticamente qué ítems son verdaderos y cuáles
falsos. Las variantes con hipótesis incoherentes o precondiciones
insatisfechas se descartan.
ProblemaTipoProfe muestra todas las cuestiones para cada enunciado
(sin descartar), facilitando la revisión del banco.
Preguntas multi-parte
ProblemaMultiParte genera variantes en las que cada enunciado va
seguido de varios bloques de sub-preguntas independientes. Es útil para
preguntas AMC con múltiples apartados o para el formato cloze de Moodle:
from qbank import *
subpreguntas = [
SubPregunta("¿Cuál es el valor de $A$? ",
[Cuestion("Verdadero.", v("A")),
Cuestion("Falso.", ~v("A"))]),
SubPregunta("¿Cuál es el valor de $B$? ",
[Cuestion("Verdadero.", v("B")),
Cuestion("Falso.", ~v("B"))]),
]
p = ProblemaMultiParte(
["Suponga que ",
[Supuesto("$A$ es verdadero, ", v("A")),
Supuesto("$B$ es verdadero, ", v("B"))]],
subpreguntas,
)
Preguntas paramétricas con setup
El parámetro setup permite que los valores numéricos o simbólicos
cambien en cada variante. El texto de los slots admite marcadores
@variable para interpolación:
import random
def numeros():
a = random.randint(1, 9)
b = random.randint(1, 9)
return {'a': a, 'b': b, 'suma': a + b}
p = ProblemaTipo(
["Sean $a = @a$ y $b = @b$. ",
[Cuestion("$a + b = @suma$", True),
Cuestion("$a + b > 10$", lambda ns: ns['a'] + ns['b'] > 10)]],
setup=numeros,
)
Persistencia en formato JSON
Guarda y carga problemas (ProblemaTipo, ProblemaMultiParte,
ProblemaVF) sin reescribir el código Python:
from qbank import load_problema, save_problema
p = load_problema('mi_problema.json')
save_problema(p, 'copia.json')
Para bancos de múltiples problemas: load_banco / save_banco.
Editor visual en Jupyter
ProblemaTipoEditor es un formulario interactivo (requiere
ipywidgets) que permite construir, previsualizar y guardar problemas
sin escribir código:
from qbank import ProblemaTipoEditor
editor = ProblemaTipoEditor() # editor vacío
editor = ProblemaTipoEditor('p.json') # cargar desde fichero
p = editor.to_problema() # obtener el ProblemaTipo
Ver Manual.org si los widgets se muestran como texto en lugar del formulario.
Exportación a AMC y Moodle
Formato AMC (LaTeX)
Función de bajo nivel que devuelve un bloque LaTeX listo para escribir al fichero:
with open("preguntas.tex", "w") as f:
for etiqueta, partes in p.por_partes():
for enunciado, cuestiones in partes:
f.write(AMCblock("MiCuestionario", etiqueta, enunciado, cuestiones))
Vista aplanada para el profesor (todas las cuestiones con marcas):
n = QuizAMCProfe("MiCuestionario", "exportaciones/", p)
print(f"{n} bloque(s) escritos")
Para preguntas multi-parte: AMC_multipart.
Formato Moodle (XML vía LaTeX)
# Vista alumno
n = QuizMoodle("MiCuestionario", "exportaciones/", p, last_choice=True)
print(f"{n} variante(s) escritas")
# Vista profe (fracciones de puntuación visibles)
QuizMoodleProfe("MiCuestionario", "exportaciones/", p)
# Con paquete LaTeX adicional y texto comodín personalizados
QuizMoodle("MiCuestionario", "exportaciones/", p,
aux_latex=r"\usepackage{nacal-moodle}",
last_choice_text="Las demás opciones son falsas")
QuizMoodle y QuizMoodleProfe devuelven un int con el número de
variantes escritas, útil para logging en scripts de build.
Para preguntas ProblemaVF: QuizVFMoodle.
Exportación a código Python editable
save_problema_py genera un fichero .py con la definición del
problema como listas editables, tanto para ProblemaTipo como para
ProblemaMultiParte:
from qbank import save_problema_py
save_problema_py(p, 'mi_problema.py')
El fichero resultante puede abrirse con cualquier editor, modificarse y ejecutarse directamente con Python.
Documentación
CalcPropQuiz.org— código fuente comentado del módulo_quiz,_jsony_widgets.CalcPropExport.org— código fuente comentado del módulo_export.Manual.org— manual de usuario con ejemplos.
Los ficheros Python se generan desde los .org mediante
org-babel-tangle.
Tests
pytest
Autoría y licencia
Copyright (C) 2020-2026 Andrés Bujosa, Marcos Bujosa (_quiz)
Copyright (C) 2020-2026 Marcos Bujosa (_export, _json, _widgets)
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
See the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file calcprop_qbank-0.3.2.tar.gz.
File metadata
- Download URL: calcprop_qbank-0.3.2.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80b0835c60bd801d8dd34c14d61eaffa9f61a1338e96b9945f953c900392ee64
|
|
| MD5 |
14601e6b2444fa75d77afa89231bd609
|
|
| BLAKE2b-256 |
7d9815c346d094a059a335c2013282565137841668c3e516e1dcdc145be267a1
|
File details
Details for the file calcprop_qbank-0.3.2-py3-none-any.whl.
File metadata
- Download URL: calcprop_qbank-0.3.2-py3-none-any.whl
- Upload date:
- Size: 37.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39c934941f75eb0956113d597866271877e1bc681218d166019228b0c3699db4
|
|
| MD5 |
19e91309c631983718a2d63349f4c4b4
|
|
| BLAKE2b-256 |
a5f17a4362154ebf24a64df60f605340f09db543a4148f46e96927905dbf1b2a
|