@rsconcept/domain 1.7.3 → 1.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cctext/language-api.js +3 -2
- package/dist/cctext/language-api.js.map +1 -1
- package/dist/library/rsform-api.d.ts +5 -2
- package/dist/library/rsform-api.js +4 -1
- package/dist/library/rsform-api.js.map +1 -1
- package/package.json +1 -1
- package/src/cctext/language-api.test.ts +4 -0
- package/src/cctext/language-api.ts +3 -2
- package/src/library/rsform-api.test.ts +17 -0
- package/src/library/rsform-api.ts +5 -2
|
@@ -78,10 +78,11 @@ function applyEntityReferenceMapping(text, mapping) {
|
|
|
78
78
|
let output = "";
|
|
79
79
|
for (const segment of text.matchAll(ENTITY_REFERENCE_PATTERN)) {
|
|
80
80
|
const entity = segment[1];
|
|
81
|
+
const entityKey = entity.trim();
|
|
81
82
|
const start = segment.index ?? 0;
|
|
82
|
-
if (
|
|
83
|
+
if (entityKey in mapping) {
|
|
83
84
|
output += text.substring(posInput, start + 2);
|
|
84
|
-
output += mapping[
|
|
85
|
+
output += mapping[entityKey];
|
|
85
86
|
output += text.substring(start + 2 + entity.length, start + segment[0].length);
|
|
86
87
|
posInput = start + segment[0].length;
|
|
87
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language-api.js","names":[],"sources":["../../src/cctext/language-api.ts"],"sourcesContent":["/**\n * Module: Natural language model API.\n */\n\nimport {\n Case,\n type EntityReference,\n Grammeme,\n type IReference,\n Plurality,\n ReferenceType,\n type SyntacticReference,\n type TermContext,\n type TermContextItem,\n type WordForm\n} from './language';\n\ninterface Position {\n from: number;\n to: number;\n}\n\ninterface ResolvedReference {\n ref: IReference;\n resolved: string;\n posInput: Position;\n}\n\nconst REFERENCE_PATTERN = /@{[^{}]*?}/g;\nconst ENTITY_REFERENCE_PATTERN = /@{([^0-9\\-][^}|{]*?)\\|([^}|{]*?)}/g;\n\n/** Represents generated lexeme forms. */\nexport interface Lexeme {\n items: { text: string; grams: string }[];\n}\n\n/** Equality comparator for {@link WordForm}. Compares a set of Grammemes attached to wordforms. */\nexport function wordFormEquals(left: WordForm, right: WordForm): boolean {\n if (left.grams.length !== right.grams.length) {\n return false;\n }\n for (let index = 0; index < left.grams.length; ++index) {\n if (left.grams[index] !== right.grams[index]) {\n return false;\n }\n }\n return true;\n}\n\n/** Transforms {@link Grammeme} enumeration to {@link Grammeme}. */\nexport function parseGrammemes(termForm: string): Grammeme[] {\n const result: Grammeme[] = [];\n for (const chunk of termForm.split(',')) {\n const gram = chunk.trim();\n if (gram !== '') {\n result.push(gram as Grammeme);\n }\n }\n return result.sort(grammemeCompare);\n}\n\n/** Generates all supported noun forms using nominal text for every form. */\nexport function generateNominalLexeme(data: { text: string }): Lexeme {\n return {\n items: Plurality.flatMap(plurality =>\n Case.map(gramCase => ({\n text: data.text,\n grams: `${plurality},${gramCase}`\n }))\n )\n };\n}\n\n/**\n * Extracts {@link EntityReference} from string representation.\n *\n * @param text - Reference text in a valid pattern. Must fit format '\\@\\{GLOBAL_ID|GRAMMEMES\\}'\n */\nexport function parseEntityReference(text: string): EntityReference {\n const ref = parseReference(text);\n if (ref?.type !== ReferenceType.ENTITY) {\n throw new Error(`Invalid entity reference: ${text}`);\n }\n return ref.data as EntityReference;\n}\n\n/**\n * Extracts {@link SyntacticReference} from string representation.\n *\n * @param text - Reference text in a valid pattern. Must fit format '\\@\\{OFFSET|NOMINAL_FORM\\}'\n */\nexport function parseSyntacticReference(text: string): SyntacticReference {\n const ref = parseReference(text);\n if (ref?.type !== ReferenceType.SYNTACTIC) {\n throw new Error(`Invalid syntactic reference: ${text}`);\n }\n return ref.data as SyntacticReference;\n}\n\n/** Extracts a validated reference from string representation. */\nexport function parseReference(text: string): IReference | null {\n if (text.length < 4 || !text.startsWith('@{') || !text.endsWith('}')) {\n return null;\n }\n\n const blocks = text\n .slice(2, text.length - 1)\n .split('|')\n .map(block => block.trim());\n if (blocks.length !== 2 || blocks[0] === '' || blocks[0].startsWith('0')) {\n return null;\n }\n\n if (blocks[0].startsWith('-') || /^[1-9]/.test(blocks[0])) {\n const offset = Number(blocks[0]);\n if (!Number.isInteger(offset) || offset === 0 || blocks[1] === '') {\n return null;\n }\n return {\n type: ReferenceType.SYNTACTIC,\n data: { offset, nominal: blocks[1] }\n };\n }\n\n return {\n type: ReferenceType.ENTITY,\n data: { entity: blocks[0], tags: parseGrammemes(blocks[1].replaceAll(' ', '')) }\n };\n}\n\n/** Apply alias mapping to entity references in terminological text. */\nexport function applyEntityReferenceMapping(text: string, mapping: Record<string, string>): string {\n if (text === '' || Object.keys(mapping).length === 0) {\n return text;\n }\n\n let posInput = 0;\n let output = '';\n for (const segment of text.matchAll(ENTITY_REFERENCE_PATTERN)) {\n const entity = segment[1];\n const start = segment.index ?? 0;\n if (entity in mapping) {\n output += text.substring(posInput, start + 2);\n output += mapping[entity];\n output += text.substring(start + 2 + entity.length, start + segment[0].length);\n posInput = start + segment[0].length;\n }\n }\n output += text.substring(posInput);\n return output;\n}\n\n/** Extracts unique entity aliases referenced by text. */\nexport function extractEntities(text: string): string[] {\n const result: string[] = [];\n for (const segment of text.matchAll(ENTITY_REFERENCE_PATTERN)) {\n const entity = segment[1].trim();\n if (!result.includes(entity)) {\n result.push(entity);\n }\n }\n return result;\n}\n\n/** Resolves text references using nominal terms and optional manually edited forms. */\nexport function resolveTextReferences(text: string, context: TermContext): string {\n const references = parseReferences(text);\n if (references.length === 0) {\n return text;\n }\n\n for (const ref of references) {\n if (ref.ref.type === ReferenceType.ENTITY) {\n ref.resolved = resolveEntity(ref.ref.data as EntityReference, context);\n }\n }\n references.forEach((ref, index) => {\n if (ref.ref.type === ReferenceType.SYNTACTIC) {\n ref.resolved = resolveSyntactic(ref.ref.data as SyntacticReference, index, references);\n }\n });\n\n let posInput = 0;\n let output = '';\n for (const ref of references) {\n output += text.substring(posInput, ref.posInput.from);\n output += ref.resolved;\n posInput = ref.posInput.to;\n }\n output += text.substring(posInput);\n return output;\n}\n\n/** Transforms {@link IReference} to string representation. */\nexport function referenceToString(ref: IReference): string {\n switch (ref.type) {\n case ReferenceType.ENTITY: {\n const entity = ref.data as EntityReference;\n return `@{${entity.entity}|${entity.tags.join(',')}}`;\n }\n case ReferenceType.SYNTACTIC: {\n const syntactic = ref.data as SyntacticReference;\n return `@{${syntactic.offset}|${syntactic.nominal}}`;\n }\n }\n}\n\n// ===== Internals =======\n\n/** Compares {@link Grammeme} based on Grammeme enum and alpha order for strings. */\nfunction grammemeCompare(left: Grammeme, right: Grammeme): number {\n const indexLeft = Object.values(Grammeme).findIndex(gram => gram === left);\n const indexRight = Object.values(Grammeme).findIndex(gram => gram === right);\n if (indexLeft === -1 && indexRight === -1) {\n return left.localeCompare(right);\n } else if (indexLeft === -1 && indexRight !== -1) {\n return 1;\n } else if (indexLeft !== -1 && indexRight === -1) {\n return -1;\n } else {\n return indexLeft - indexRight;\n }\n}\n\nfunction parseReferences(text: string): ResolvedReference[] {\n const result: ResolvedReference[] = [];\n for (const segment of text.matchAll(REFERENCE_PATTERN)) {\n const ref = parseReference(segment[0]);\n if (ref) {\n result.push({\n ref,\n resolved: '',\n posInput: { from: segment.index ?? 0, to: (segment.index ?? 0) + segment[0].length }\n });\n }\n }\n return result;\n}\n\nfunction resolveEntity(ref: EntityReference, context: TermContext): string {\n const entity = context[ref.entity];\n if (!entity) {\n return `!Неизвестная сущность: ${ref.entity}!`;\n }\n\n const resolved = getEntityForm(entity, ref.tags);\n return resolved === '' ? `!Отсутствует термин: ${ref.entity}!` : resolved;\n}\n\nfunction getEntityForm(entity: TermContextItem, grams: Grammeme[]): string {\n if (grams.length === 0) {\n return entity.nominal;\n }\n\n const manual = entity.forms?.find(form => matchGrams(grams, form.grams));\n return manual?.text ?? entity.nominal;\n}\n\nfunction matchGrams(query: Grammeme[], candidate: Grammeme[]): boolean {\n for (const gram of candidate) {\n if (!query.includes(gram)) {\n return false;\n }\n }\n return true;\n}\n\nfunction resolveSyntactic(ref: SyntacticReference, index: number, references: ResolvedReference[]): string {\n const master = findSyntacticMaster(ref.offset, index, references);\n if (!master) {\n return `!Некорректное смещение: ${ref.offset}!`;\n }\n return ref.nominal;\n}\n\nfunction findSyntacticMaster(\n offset: number,\n index: number,\n references: ResolvedReference[]\n): ResolvedReference | undefined {\n if (offset > 0) {\n let position = index + 1;\n let left = offset;\n while (position < references.length) {\n if (references[position].ref.type === ReferenceType.ENTITY) {\n if (left === 1) {\n return references[position];\n }\n left -= 1;\n }\n position += 1;\n }\n } else {\n let position = index - 1;\n let left = offset;\n while (position >= 0) {\n if (references[position].ref.type === ReferenceType.ENTITY) {\n if (left === -1) {\n return references[position];\n }\n left += 1;\n }\n position -= 1;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"language-api.js","names":[],"sources":["../../src/cctext/language-api.ts"],"sourcesContent":["/**\n * Module: Natural language model API.\n */\n\nimport {\n Case,\n type EntityReference,\n Grammeme,\n type IReference,\n Plurality,\n ReferenceType,\n type SyntacticReference,\n type TermContext,\n type TermContextItem,\n type WordForm\n} from './language';\n\ninterface Position {\n from: number;\n to: number;\n}\n\ninterface ResolvedReference {\n ref: IReference;\n resolved: string;\n posInput: Position;\n}\n\nconst REFERENCE_PATTERN = /@{[^{}]*?}/g;\nconst ENTITY_REFERENCE_PATTERN = /@{([^0-9\\-][^}|{]*?)\\|([^}|{]*?)}/g;\n\n/** Represents generated lexeme forms. */\nexport interface Lexeme {\n items: { text: string; grams: string }[];\n}\n\n/** Equality comparator for {@link WordForm}. Compares a set of Grammemes attached to wordforms. */\nexport function wordFormEquals(left: WordForm, right: WordForm): boolean {\n if (left.grams.length !== right.grams.length) {\n return false;\n }\n for (let index = 0; index < left.grams.length; ++index) {\n if (left.grams[index] !== right.grams[index]) {\n return false;\n }\n }\n return true;\n}\n\n/** Transforms {@link Grammeme} enumeration to {@link Grammeme}. */\nexport function parseGrammemes(termForm: string): Grammeme[] {\n const result: Grammeme[] = [];\n for (const chunk of termForm.split(',')) {\n const gram = chunk.trim();\n if (gram !== '') {\n result.push(gram as Grammeme);\n }\n }\n return result.sort(grammemeCompare);\n}\n\n/** Generates all supported noun forms using nominal text for every form. */\nexport function generateNominalLexeme(data: { text: string }): Lexeme {\n return {\n items: Plurality.flatMap(plurality =>\n Case.map(gramCase => ({\n text: data.text,\n grams: `${plurality},${gramCase}`\n }))\n )\n };\n}\n\n/**\n * Extracts {@link EntityReference} from string representation.\n *\n * @param text - Reference text in a valid pattern. Must fit format '\\@\\{GLOBAL_ID|GRAMMEMES\\}'\n */\nexport function parseEntityReference(text: string): EntityReference {\n const ref = parseReference(text);\n if (ref?.type !== ReferenceType.ENTITY) {\n throw new Error(`Invalid entity reference: ${text}`);\n }\n return ref.data as EntityReference;\n}\n\n/**\n * Extracts {@link SyntacticReference} from string representation.\n *\n * @param text - Reference text in a valid pattern. Must fit format '\\@\\{OFFSET|NOMINAL_FORM\\}'\n */\nexport function parseSyntacticReference(text: string): SyntacticReference {\n const ref = parseReference(text);\n if (ref?.type !== ReferenceType.SYNTACTIC) {\n throw new Error(`Invalid syntactic reference: ${text}`);\n }\n return ref.data as SyntacticReference;\n}\n\n/** Extracts a validated reference from string representation. */\nexport function parseReference(text: string): IReference | null {\n if (text.length < 4 || !text.startsWith('@{') || !text.endsWith('}')) {\n return null;\n }\n\n const blocks = text\n .slice(2, text.length - 1)\n .split('|')\n .map(block => block.trim());\n if (blocks.length !== 2 || blocks[0] === '' || blocks[0].startsWith('0')) {\n return null;\n }\n\n if (blocks[0].startsWith('-') || /^[1-9]/.test(blocks[0])) {\n const offset = Number(blocks[0]);\n if (!Number.isInteger(offset) || offset === 0 || blocks[1] === '') {\n return null;\n }\n return {\n type: ReferenceType.SYNTACTIC,\n data: { offset, nominal: blocks[1] }\n };\n }\n\n return {\n type: ReferenceType.ENTITY,\n data: { entity: blocks[0], tags: parseGrammemes(blocks[1].replaceAll(' ', '')) }\n };\n}\n\n/** Apply alias mapping to entity references in terminological text. */\nexport function applyEntityReferenceMapping(text: string, mapping: Record<string, string>): string {\n if (text === '' || Object.keys(mapping).length === 0) {\n return text;\n }\n\n let posInput = 0;\n let output = '';\n for (const segment of text.matchAll(ENTITY_REFERENCE_PATTERN)) {\n const entity = segment[1];\n const entityKey = entity.trim();\n const start = segment.index ?? 0;\n if (entityKey in mapping) {\n output += text.substring(posInput, start + 2);\n output += mapping[entityKey];\n output += text.substring(start + 2 + entity.length, start + segment[0].length);\n posInput = start + segment[0].length;\n }\n }\n output += text.substring(posInput);\n return output;\n}\n\n/** Extracts unique entity aliases referenced by text. */\nexport function extractEntities(text: string): string[] {\n const result: string[] = [];\n for (const segment of text.matchAll(ENTITY_REFERENCE_PATTERN)) {\n const entity = segment[1].trim();\n if (!result.includes(entity)) {\n result.push(entity);\n }\n }\n return result;\n}\n\n/** Resolves text references using nominal terms and optional manually edited forms. */\nexport function resolveTextReferences(text: string, context: TermContext): string {\n const references = parseReferences(text);\n if (references.length === 0) {\n return text;\n }\n\n for (const ref of references) {\n if (ref.ref.type === ReferenceType.ENTITY) {\n ref.resolved = resolveEntity(ref.ref.data as EntityReference, context);\n }\n }\n references.forEach((ref, index) => {\n if (ref.ref.type === ReferenceType.SYNTACTIC) {\n ref.resolved = resolveSyntactic(ref.ref.data as SyntacticReference, index, references);\n }\n });\n\n let posInput = 0;\n let output = '';\n for (const ref of references) {\n output += text.substring(posInput, ref.posInput.from);\n output += ref.resolved;\n posInput = ref.posInput.to;\n }\n output += text.substring(posInput);\n return output;\n}\n\n/** Transforms {@link IReference} to string representation. */\nexport function referenceToString(ref: IReference): string {\n switch (ref.type) {\n case ReferenceType.ENTITY: {\n const entity = ref.data as EntityReference;\n return `@{${entity.entity}|${entity.tags.join(',')}}`;\n }\n case ReferenceType.SYNTACTIC: {\n const syntactic = ref.data as SyntacticReference;\n return `@{${syntactic.offset}|${syntactic.nominal}}`;\n }\n }\n}\n\n// ===== Internals =======\n\n/** Compares {@link Grammeme} based on Grammeme enum and alpha order for strings. */\nfunction grammemeCompare(left: Grammeme, right: Grammeme): number {\n const indexLeft = Object.values(Grammeme).findIndex(gram => gram === left);\n const indexRight = Object.values(Grammeme).findIndex(gram => gram === right);\n if (indexLeft === -1 && indexRight === -1) {\n return left.localeCompare(right);\n } else if (indexLeft === -1 && indexRight !== -1) {\n return 1;\n } else if (indexLeft !== -1 && indexRight === -1) {\n return -1;\n } else {\n return indexLeft - indexRight;\n }\n}\n\nfunction parseReferences(text: string): ResolvedReference[] {\n const result: ResolvedReference[] = [];\n for (const segment of text.matchAll(REFERENCE_PATTERN)) {\n const ref = parseReference(segment[0]);\n if (ref) {\n result.push({\n ref,\n resolved: '',\n posInput: { from: segment.index ?? 0, to: (segment.index ?? 0) + segment[0].length }\n });\n }\n }\n return result;\n}\n\nfunction resolveEntity(ref: EntityReference, context: TermContext): string {\n const entity = context[ref.entity];\n if (!entity) {\n return `!Неизвестная сущность: ${ref.entity}!`;\n }\n\n const resolved = getEntityForm(entity, ref.tags);\n return resolved === '' ? `!Отсутствует термин: ${ref.entity}!` : resolved;\n}\n\nfunction getEntityForm(entity: TermContextItem, grams: Grammeme[]): string {\n if (grams.length === 0) {\n return entity.nominal;\n }\n\n const manual = entity.forms?.find(form => matchGrams(grams, form.grams));\n return manual?.text ?? entity.nominal;\n}\n\nfunction matchGrams(query: Grammeme[], candidate: Grammeme[]): boolean {\n for (const gram of candidate) {\n if (!query.includes(gram)) {\n return false;\n }\n }\n return true;\n}\n\nfunction resolveSyntactic(ref: SyntacticReference, index: number, references: ResolvedReference[]): string {\n const master = findSyntacticMaster(ref.offset, index, references);\n if (!master) {\n return `!Некорректное смещение: ${ref.offset}!`;\n }\n return ref.nominal;\n}\n\nfunction findSyntacticMaster(\n offset: number,\n index: number,\n references: ResolvedReference[]\n): ResolvedReference | undefined {\n if (offset > 0) {\n let position = index + 1;\n let left = offset;\n while (position < references.length) {\n if (references[position].ref.type === ReferenceType.ENTITY) {\n if (left === 1) {\n return references[position];\n }\n left -= 1;\n }\n position += 1;\n }\n } else {\n let position = index - 1;\n let left = offset;\n while (position >= 0) {\n if (references[position].ref.type === ReferenceType.ENTITY) {\n if (left === -1) {\n return references[position];\n }\n left += 1;\n }\n position -= 1;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ declare function generateAlias(type: CstType, schema: RSForm, takenAliases?: str
|
|
|
49
49
|
declare function inferNewSpawnPosition(schema: RSForm, targetId: number): number;
|
|
50
50
|
/** Sorts library items relevant for InlineSynthesis with specified {@link RSForm}. */
|
|
51
51
|
declare function sortItemsForInlineSynthesis(receiver: RSForm, items: readonly LibraryItem[]): LibraryItem[];
|
|
52
|
-
/** Fields of {@link Constituenta}
|
|
52
|
+
/** Fields of {@link Constituenta} updated in place by alias mapping. */
|
|
53
53
|
interface ConstituentaMappableFields {
|
|
54
54
|
alias: string;
|
|
55
55
|
definition_formal: string;
|
|
@@ -57,7 +57,10 @@ interface ConstituentaMappableFields {
|
|
|
57
57
|
term_raw: string;
|
|
58
58
|
definition_raw: string;
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Remap formal expressions and terminological entity references in constituent fields.
|
|
62
|
+
* Mutates each element of `items` in place; pass owned or cloned data only.
|
|
63
|
+
*/
|
|
61
64
|
declare function applyMappingToConstituents<T extends ConstituentaMappableFields>(items: T[], mapping: AliasMapping, changeAliases: boolean): void;
|
|
62
65
|
/** Remove alias from expression. */
|
|
63
66
|
declare function removeAliasReference(expression: string, alias: string): string;
|
|
@@ -221,7 +221,10 @@ function sortItemsForInlineSynthesis(receiver, items) {
|
|
|
221
221
|
for (const item of items) if (!result.includes(item)) result.push(item);
|
|
222
222
|
return result;
|
|
223
223
|
}
|
|
224
|
-
/**
|
|
224
|
+
/**
|
|
225
|
+
* Remap formal expressions and terminological entity references in constituent fields.
|
|
226
|
+
* Mutates each element of `items` in place; pass owned or cloned data only.
|
|
227
|
+
*/
|
|
225
228
|
function applyMappingToConstituents(items, mapping, changeAliases) {
|
|
226
229
|
for (const cst of items) {
|
|
227
230
|
if (changeAliases && cst.alias in mapping) cst.alias = mapping[cst.alias];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsform-api.js","names":[],"sources":["../../src/library/rsform-api.ts"],"sourcesContent":["/**\n * Module: API for formal representation for systems of concepts.\n */\n\nimport { applyEntityReferenceMapping } from '../cctext/language-api';\nimport {\n type AnalysisFull,\n RSErrorCode,\n TypeClass,\n TypeID,\n type TypePath,\n type Typification,\n ValueClass\n} from '../rslang';\nimport { type AliasMapping, applyAliasMapping, applyTypificationMapping } from '../rslang/api';\nimport { basic, bool, constant, type EchelonFunctional, isTypification } from '../rslang/semantic/typification';\nimport { applyPath } from '../rslang/semantic/typification-api';\n\nimport { type LibraryItem } from './library';\nimport {\n type ArgumentValue,\n type Constituenta,\n CstClass,\n CstStatus,\n CstType,\n type RSForm,\n type RSFormStats\n} from './rsform';\n\n/** Record of {@link CstType} prefixes. */\nconst CST_TYPE_PREFIX: Record<CstType, string> = {\n [CstType.NOMINAL]: 'N',\n [CstType.BASE]: 'X',\n [CstType.CONSTANT]: 'C',\n [CstType.STRUCTURED]: 'S',\n [CstType.AXIOM]: 'A',\n [CstType.TERM]: 'D',\n [CstType.FUNCTION]: 'F',\n [CstType.PREDICATE]: 'P',\n [CstType.STATEMENT]: 'T'\n};\n\n/** Record of {@link CstType} to {@link CstClass} mapping. */\nconst CST_TYPE_TO_CLASS: Record<CstType, CstClass> = {\n [CstType.NOMINAL]: CstClass.NOMINAL,\n [CstType.BASE]: CstClass.BASIC,\n [CstType.CONSTANT]: CstClass.BASIC,\n [CstType.STRUCTURED]: CstClass.BASIC,\n [CstType.TERM]: CstClass.DERIVED,\n [CstType.FUNCTION]: CstClass.DERIVED,\n [CstType.AXIOM]: CstClass.STATEMENT,\n [CstType.PREDICATE]: CstClass.DERIVED,\n [CstType.STATEMENT]: CstClass.STATEMENT\n};\n\n/** Checks if {@link Constituenta} is a schema issue. */\nexport function isSchemaIssue(cst: Constituenta): boolean {\n if (\n cst.homonyms.length > 0 ||\n cst.formalDuplicates.length > 0 ||\n cst.status === CstStatus.INCORRECT ||\n cst.status === CstStatus.INCALCULABLE ||\n cst.is_type_mismatch\n ) {\n return true;\n }\n if (isBasicConcept(cst.cst_type) && !isLogical(cst.cst_type)) {\n if (!cst.convention || !cst.term_resolved) {\n return true;\n }\n }\n return false;\n}\n\n/** Infers the status of an expression based on parsing and value information. */\nexport function inferStatus(parse: boolean, value?: ValueClass | null): CstStatus {\n if (!parse) {\n return CstStatus.INCORRECT;\n }\n if (value === null) {\n return CstStatus.INCALCULABLE;\n }\n if (value === ValueClass.PROPERTY) {\n return CstStatus.PROPERTY;\n }\n return CstStatus.VERIFIED;\n}\n\n/** Infers type of constituent for a given template and arguments. */\nexport function inferTemplatedType(templateType: CstType, args: ArgumentValue[]): CstType {\n if (args.length === 0 || args.some(arg => !arg.value)) {\n return templateType;\n } else if (templateType === CstType.PREDICATE) {\n return CstType.AXIOM;\n } else {\n return CstType.TERM;\n }\n}\n\n/** Checks if given expression is a template. */\nexport function inferTemplate(expression: string): boolean {\n const match = expression.match(/R\\d+/g);\n return (match && match?.length > 0) ?? false;\n}\n\n/** Infers the {@link CstClass} based on the provided {@link CstType} and template status. */\nexport function inferClass(type: CstType, isTemplate: boolean = false): CstClass {\n if (isTemplate) {\n return CstClass.TEMPLATE;\n }\n return CST_TYPE_TO_CLASS[type];\n}\n\n/** Check if {@link Constituenta} is a template or a category. */\nexport function isTemplateCst(cst: Constituenta): boolean {\n return cst.cst_type === CstType.FUNCTION || cst.cst_type === CstType.PREDICATE || cst.cst_type === CstType.STATEMENT;\n}\n\n/** Apply filter based on start {@link Constituenta} type. */\nexport function applyFilterCategory(start: Constituenta, items: Constituenta[]): Constituenta[] {\n const startIndex = items.indexOf(start);\n if (startIndex === -1) {\n return [];\n }\n const nextCategoryIndex = items.findIndex((cst, index) => index > startIndex && cst.cst_type === CstType.STATEMENT);\n\n return items.filter((_, index) => index >= startIndex && (nextCategoryIndex === -1 || index < nextCategoryIndex));\n}\n\n/** Prefix for alias indicating {@link CstType}. */\nexport function getCstTypePrefix(type: CstType): string {\n return CST_TYPE_PREFIX[type];\n}\n\n/** Guess {@link CstType} from user input hint. */\nexport function guessCstType(hint: string): CstType | null {\n if (hint.length !== 1) {\n return null;\n }\n for (const [type, prefix] of Object.entries(CST_TYPE_PREFIX)) {\n if (hint === prefix) {\n return type as CstType;\n }\n }\n return null;\n}\n\n/** Evaluate if {@link CstType} is basic concept. */\nexport function isBasicConcept(type: CstType): boolean {\n switch (type) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n return true;\n\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is base set or constant set. */\nexport function isBaseSet(type: CstType): boolean {\n switch (type) {\n case CstType.BASE:\n case CstType.CONSTANT:\n return true;\n\n case CstType.NOMINAL:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is a function. */\nexport function isFunctional(type: CstType): boolean {\n switch (type) {\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n case CstType.TERM:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is logical. */\nexport function isLogical(type: CstType): boolean {\n switch (type) {\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return false;\n }\n}\n\n/** Evaluate if {@link Constituenta} can be used produce structure. */\nexport function canProduceStructure(cst: Constituenta): boolean {\n switch (cst.cst_type) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.AXIOM:\n case CstType.STATEMENT:\n case CstType.PREDICATE:\n return false;\n }\n if (!cst.effectiveType) {\n return false;\n }\n if (cst.cst_type === CstType.FUNCTION) {\n const result = (cst.effectiveType as EchelonFunctional).result;\n return typeCanProduceStructure(result);\n }\n if (!isTypification(cst.effectiveType)) {\n return false;\n }\n return typeCanProduceStructure(cst.effectiveType as Typification);\n}\n\n/** Evaluate if {@link CstType} can have manual typification. */\nexport function canHaveManualTypification(type: CstType): boolean {\n switch (type) {\n case CstType.STRUCTURED:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Validate alias format for a given {@link CstType} (prefix + digits, min length 2). */\nexport function validateAliasFormat(alias: string, type: CstType): boolean {\n if (alias.length < 2) {\n return false;\n }\n const prefix = getCstTypePrefix(type);\n if (!alias.startsWith(prefix)) {\n return false;\n }\n if (!/^\\d+$/.exec(alias.substring(prefix.length))) {\n return false;\n }\n return true;\n}\n\n/** Validate new alias against {@link CstType} and {@link RSForm}. */\nexport function validateNewAlias(alias: string, type: CstType, schema: RSForm): boolean {\n if (!validateAliasFormat(alias, type)) {\n return false;\n }\n if (schema.cstByAlias.has(alias)) {\n return false;\n }\n return true;\n}\n\n/** Generate alias for new {@link Constituenta} of a given {@link CstType} for current {@link RSForm}. */\nexport function generateAlias(type: CstType, schema: RSForm, takenAliases: string[] = []): string {\n const prefix = getCstTypePrefix(type);\n if (schema.items.length <= 0) {\n return `${prefix}1`;\n }\n let index = schema.items.reduce((prev, cst, index) => {\n if (cst.cst_type !== type) {\n return prev;\n }\n index = Number(cst.alias.slice(1 - cst.alias.length)) + 1;\n return Math.max(prev, index);\n }, 1);\n let alias = `${prefix}${index}`;\n while (takenAliases.includes(alias)) {\n index = index + 1;\n alias = `${prefix}${index}`;\n }\n return alias;\n}\n\n/**\n * Id to pass as `insert_after` when creating a new {@link Constituenta} spawned by `targetId`:\n * after the last existing child of that spawner, or after the spawner itself if none.\n */\nexport function inferNewSpawnPosition(schema: RSForm, targetId: number): number {\n let last: number | null = null;\n for (const cst of schema.items) {\n if (cst.spawner === targetId) {\n last = cst.id;\n }\n }\n return last ?? targetId;\n}\n\n/** Sorts library items relevant for InlineSynthesis with specified {@link RSForm}. */\nexport function sortItemsForInlineSynthesis(receiver: RSForm, items: readonly LibraryItem[]): LibraryItem[] {\n const result = items.filter(item => item.location === receiver.location);\n for (const item of items) {\n if (item.visible && item.owner === item.owner && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (item.visible && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (!result.includes(item)) {\n result.push(item);\n }\n }\n return result;\n}\n\n/** Fields of {@link Constituenta} that are updated by alias mapping. */\nexport interface ConstituentaMappableFields {\n alias: string;\n definition_formal: string;\n typification_manual: string;\n term_raw: string;\n definition_raw: string;\n}\n\n/** Remap formal expressions and terminological entity references in constituent fields. */\nexport function applyMappingToConstituents<T extends ConstituentaMappableFields>(\n items: T[],\n mapping: AliasMapping,\n changeAliases: boolean\n): void {\n for (const cst of items) {\n if (changeAliases && cst.alias in mapping) {\n cst.alias = mapping[cst.alias];\n }\n cst.definition_formal = applyAliasMapping(cst.definition_formal, mapping);\n cst.typification_manual = applyTypificationMapping(cst.typification_manual, mapping);\n cst.term_raw = applyEntityReferenceMapping(cst.term_raw, mapping);\n cst.definition_raw = applyEntityReferenceMapping(cst.definition_raw, mapping);\n }\n}\n\n/** Remove alias from expression. */\nexport function removeAliasReference(expression: string, alias: string): string {\n const result = expression.replaceAll(new RegExp(`\\\\b${alias}\\\\b`, 'g'), 'DEL');\n return result === 'DEL' ? '' : result;\n}\n\n/** Add alias to expression. */\nexport function addAliasReference(expression: string, alias: string): string {\n return expression + ' ' + alias;\n}\n\n/** Returns expected {@link TypeClass} of formal definition for {@link CstType}. */\nexport function typeClassForCstType(cstType: CstType): TypeClass {\n switch (cstType) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.TERM:\n return TypeClass.typification;\n case CstType.FUNCTION:\n return TypeClass.function;\n case CstType.PREDICATE:\n return TypeClass.predicate;\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return TypeClass.logic;\n }\n}\n\n/** Checks whether a constituenta type supports formal definitions. */\nexport function canHaveFormalDefinition(cstType: CstType): boolean {\n return cstType !== CstType.BASE && cstType !== CstType.CONSTANT;\n}\n\n/** Analyze expression for {@link RSForm}. */\nexport function getAnalysisFor(expression: string, cstType: CstType, schema: RSForm, alias?: string): AnalysisFull {\n if (!canHaveFormalDefinition(cstType)) {\n if (expression.trim().length === 0) {\n const fallbackAlias = alias && alias.length > 0 ? alias : 'X0';\n const type = cstType === CstType.BASE ? bool(basic(fallbackAlias)) : bool(constant(fallbackAlias));\n return {\n success: true,\n type,\n valueClass: ValueClass.VALUE,\n errors: [],\n ast: null\n };\n }\n return {\n success: false,\n type: null,\n valueClass: null,\n errors: [\n {\n code: RSErrorCode.definitionNotAllowed,\n from: 0,\n to: Math.max(expression.length, 1),\n params: [cstType, alias ?? '']\n }\n ],\n ast: null\n };\n }\n return schema.analyzer.checkFull(expression, {\n expected: typeClassForCstType(cstType),\n isDomain: cstType === CstType.STRUCTURED\n });\n}\n\n/** Calculate statistics for {@link RSForm}. */\nexport function calculateSchemaStats(target: RSForm): RSFormStats {\n const items = target.items;\n return {\n count_all: items.length,\n count_crucial: items.reduce((sum, cst) => sum + (cst.crucial ? 1 : 0), 0),\n\n step_complexity: items.reduce((sum, cst) => sum + calculateStepComplexity(cst), 0),\n\n count_problematic: items.reduce((sum, cst) => sum + (isSchemaIssue(cst) ? 1 : 0), 0),\n count_homonyms: items.reduce((sum, cst) => sum + (cst.homonyms.length > 0 ? 1 : 0), 0),\n count_formal_duplicates: items.reduce((sum, cst) => sum + (cst.formalDuplicates.length > 0 ? 1 : 0), 0),\n count_missing_convention: items.reduce((sum, cst) => sum + (isMissingConvention(cst) ? 1 : 0), 0),\n count_type_mismatch: items.reduce((sum, cst) => sum + (cst.is_type_mismatch ? 1 : 0), 0),\n\n count_incorrect: items.reduce((sum, cst) => sum + (cst.status === CstStatus.INCORRECT ? 1 : 0), 0),\n count_property: items.reduce((sum, cst) => sum + (cst.analysis?.valueClass === ValueClass.PROPERTY ? 1 : 0), 0),\n count_incalculable: items.reduce(\n (sum, cst) => sum + (cst.analysis?.success && cst.analysis.valueClass === null ? 1 : 0),\n 0\n ),\n count_inherited: items.reduce((sum, cst) => sum + (cst.is_inherited ? 1 : 0), 0),\n\n count_text_term: items.reduce((sum, cst) => sum + (cst.term_raw ? 1 : 0), 0),\n count_definition: items.reduce((sum, cst) => sum + (cst.definition_raw ? 1 : 0), 0),\n count_convention: items.reduce((sum, cst) => sum + (isBasicConcept(cst.cst_type) && cst.convention ? 1 : 0), 0),\n count_comment: items.reduce((sum, cst) => sum + (!isBasicConcept(cst.cst_type) && !cst.convention ? 1 : 0), 0),\n\n count_base: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.BASE ? 1 : 0), 0),\n count_constant: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.CONSTANT ? 1 : 0), 0),\n count_structured: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.STRUCTURED ? 1 : 0), 0),\n count_axiom: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.AXIOM ? 1 : 0), 0),\n count_term: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.TERM ? 1 : 0), 0),\n count_function: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.FUNCTION ? 1 : 0), 0),\n count_predicate: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.PREDICATE ? 1 : 0), 0),\n count_statement: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.STATEMENT ? 1 : 0), 0),\n count_nominal: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.NOMINAL ? 1 : 0), 0)\n };\n}\n\n/** Finds {@link Constituenta} by structure path. */\nexport function findCstByStructure(schema: RSForm, target: Constituenta, path: TypePath): Constituenta | null {\n for (const cst of schema.items) {\n if (cst.spawner === target.id && cst.spawner_path) {\n if (cst.spawner_path.length === path.length && cst.spawner_path.every((v, i) => v === path[i])) {\n return cst;\n }\n }\n }\n return null;\n}\n\n/** Retrieves name for piece of target {@link Constituenta} structure. */\nexport function getStructureName(schema: RSForm, target: Constituenta, path: TypePath): string {\n const representation = findCstByStructure(schema, target, path);\n if (representation) {\n return `${representation.alias}: ${representation.term_resolved}`;\n }\n if (!isTypification(target.effectiveType)) {\n return '';\n }\n const type = applyPath(target.effectiveType as Typification, path);\n if (type?.typeID === TypeID.basic) {\n const cst = schema.cstByAlias.get(type.baseID);\n if (cst?.term_resolved) {\n return `${cst.alias}: ${cst.term_resolved}`;\n }\n }\n return '';\n}\n\n// ========= Internals =====\nfunction calculateStepComplexity(cst: Constituenta): number {\n if (cst.cst_type === CstType.AXIOM || cst.cst_type === CstType.NOMINAL || !isBasicConcept(cst.cst_type)) {\n return 0;\n }\n if (cst.cst_type === CstType.BASE || cst.cst_type === CstType.CONSTANT || !cst.effectiveType) {\n return 1;\n }\n\n const type = cst.effectiveType as Typification;\n return calculateTypificationComplexity(type) + 1;\n}\n\nfunction calculateTypificationComplexity(type: Typification): number {\n switch (type.typeID) {\n case TypeID.basic:\n case TypeID.integer:\n case TypeID.anyTypification:\n return 0;\n case TypeID.tuple:\n return (\n type.factors.length + type.factors.reduce((sum, factor) => sum + calculateTypificationComplexity(factor), 0)\n );\n case TypeID.collection:\n if (type.base.typeID === TypeID.tuple) {\n let sum = 0;\n type.base.factors.forEach(factor => {\n sum += calculateTypificationComplexity(factor);\n });\n return sum + type.base.factors.length;\n } else if (type.base.typeID === TypeID.collection) {\n return calculateTypificationComplexity(type.base) + 1;\n }\n return 0;\n }\n}\n\nfunction isMissingConvention(cst: Constituenta): boolean {\n if (isBasicConcept(cst.cst_type) && !isLogical(cst.cst_type)) {\n if (!cst.convention || !cst.term_resolved) {\n return true;\n }\n }\n return false;\n}\n\n/** Evaluate if {@link Typification} can be used to produce structure. */\nfunction typeCanProduceStructure(type: Typification): boolean {\n if (type.typeID === TypeID.basic || type.typeID === TypeID.integer || type.typeID === TypeID.anyTypification) {\n return false;\n } else if (type.typeID === TypeID.tuple) {\n return true;\n } else {\n return (\n type.base.typeID !== TypeID.basic &&\n type.base.typeID !== TypeID.integer &&\n type.base.typeID !== TypeID.anyTypification\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rsform-api.js","names":[],"sources":["../../src/library/rsform-api.ts"],"sourcesContent":["/**\n * Module: API for formal representation for systems of concepts.\n */\n\nimport { applyEntityReferenceMapping } from '../cctext/language-api';\nimport {\n type AnalysisFull,\n RSErrorCode,\n TypeClass,\n TypeID,\n type TypePath,\n type Typification,\n ValueClass\n} from '../rslang';\nimport { type AliasMapping, applyAliasMapping, applyTypificationMapping } from '../rslang/api';\nimport { basic, bool, constant, type EchelonFunctional, isTypification } from '../rslang/semantic/typification';\nimport { applyPath } from '../rslang/semantic/typification-api';\n\nimport { type LibraryItem } from './library';\nimport {\n type ArgumentValue,\n type Constituenta,\n CstClass,\n CstStatus,\n CstType,\n type RSForm,\n type RSFormStats\n} from './rsform';\n\n/** Record of {@link CstType} prefixes. */\nconst CST_TYPE_PREFIX: Record<CstType, string> = {\n [CstType.NOMINAL]: 'N',\n [CstType.BASE]: 'X',\n [CstType.CONSTANT]: 'C',\n [CstType.STRUCTURED]: 'S',\n [CstType.AXIOM]: 'A',\n [CstType.TERM]: 'D',\n [CstType.FUNCTION]: 'F',\n [CstType.PREDICATE]: 'P',\n [CstType.STATEMENT]: 'T'\n};\n\n/** Record of {@link CstType} to {@link CstClass} mapping. */\nconst CST_TYPE_TO_CLASS: Record<CstType, CstClass> = {\n [CstType.NOMINAL]: CstClass.NOMINAL,\n [CstType.BASE]: CstClass.BASIC,\n [CstType.CONSTANT]: CstClass.BASIC,\n [CstType.STRUCTURED]: CstClass.BASIC,\n [CstType.TERM]: CstClass.DERIVED,\n [CstType.FUNCTION]: CstClass.DERIVED,\n [CstType.AXIOM]: CstClass.STATEMENT,\n [CstType.PREDICATE]: CstClass.DERIVED,\n [CstType.STATEMENT]: CstClass.STATEMENT\n};\n\n/** Checks if {@link Constituenta} is a schema issue. */\nexport function isSchemaIssue(cst: Constituenta): boolean {\n if (\n cst.homonyms.length > 0 ||\n cst.formalDuplicates.length > 0 ||\n cst.status === CstStatus.INCORRECT ||\n cst.status === CstStatus.INCALCULABLE ||\n cst.is_type_mismatch\n ) {\n return true;\n }\n if (isBasicConcept(cst.cst_type) && !isLogical(cst.cst_type)) {\n if (!cst.convention || !cst.term_resolved) {\n return true;\n }\n }\n return false;\n}\n\n/** Infers the status of an expression based on parsing and value information. */\nexport function inferStatus(parse: boolean, value?: ValueClass | null): CstStatus {\n if (!parse) {\n return CstStatus.INCORRECT;\n }\n if (value === null) {\n return CstStatus.INCALCULABLE;\n }\n if (value === ValueClass.PROPERTY) {\n return CstStatus.PROPERTY;\n }\n return CstStatus.VERIFIED;\n}\n\n/** Infers type of constituent for a given template and arguments. */\nexport function inferTemplatedType(templateType: CstType, args: ArgumentValue[]): CstType {\n if (args.length === 0 || args.some(arg => !arg.value)) {\n return templateType;\n } else if (templateType === CstType.PREDICATE) {\n return CstType.AXIOM;\n } else {\n return CstType.TERM;\n }\n}\n\n/** Checks if given expression is a template. */\nexport function inferTemplate(expression: string): boolean {\n const match = expression.match(/R\\d+/g);\n return (match && match?.length > 0) ?? false;\n}\n\n/** Infers the {@link CstClass} based on the provided {@link CstType} and template status. */\nexport function inferClass(type: CstType, isTemplate: boolean = false): CstClass {\n if (isTemplate) {\n return CstClass.TEMPLATE;\n }\n return CST_TYPE_TO_CLASS[type];\n}\n\n/** Check if {@link Constituenta} is a template or a category. */\nexport function isTemplateCst(cst: Constituenta): boolean {\n return cst.cst_type === CstType.FUNCTION || cst.cst_type === CstType.PREDICATE || cst.cst_type === CstType.STATEMENT;\n}\n\n/** Apply filter based on start {@link Constituenta} type. */\nexport function applyFilterCategory(start: Constituenta, items: Constituenta[]): Constituenta[] {\n const startIndex = items.indexOf(start);\n if (startIndex === -1) {\n return [];\n }\n const nextCategoryIndex = items.findIndex((cst, index) => index > startIndex && cst.cst_type === CstType.STATEMENT);\n\n return items.filter((_, index) => index >= startIndex && (nextCategoryIndex === -1 || index < nextCategoryIndex));\n}\n\n/** Prefix for alias indicating {@link CstType}. */\nexport function getCstTypePrefix(type: CstType): string {\n return CST_TYPE_PREFIX[type];\n}\n\n/** Guess {@link CstType} from user input hint. */\nexport function guessCstType(hint: string): CstType | null {\n if (hint.length !== 1) {\n return null;\n }\n for (const [type, prefix] of Object.entries(CST_TYPE_PREFIX)) {\n if (hint === prefix) {\n return type as CstType;\n }\n }\n return null;\n}\n\n/** Evaluate if {@link CstType} is basic concept. */\nexport function isBasicConcept(type: CstType): boolean {\n switch (type) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n return true;\n\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is base set or constant set. */\nexport function isBaseSet(type: CstType): boolean {\n switch (type) {\n case CstType.BASE:\n case CstType.CONSTANT:\n return true;\n\n case CstType.NOMINAL:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is a function. */\nexport function isFunctional(type: CstType): boolean {\n switch (type) {\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n case CstType.TERM:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is logical. */\nexport function isLogical(type: CstType): boolean {\n switch (type) {\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return false;\n }\n}\n\n/** Evaluate if {@link Constituenta} can be used produce structure. */\nexport function canProduceStructure(cst: Constituenta): boolean {\n switch (cst.cst_type) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.AXIOM:\n case CstType.STATEMENT:\n case CstType.PREDICATE:\n return false;\n }\n if (!cst.effectiveType) {\n return false;\n }\n if (cst.cst_type === CstType.FUNCTION) {\n const result = (cst.effectiveType as EchelonFunctional).result;\n return typeCanProduceStructure(result);\n }\n if (!isTypification(cst.effectiveType)) {\n return false;\n }\n return typeCanProduceStructure(cst.effectiveType as Typification);\n}\n\n/** Evaluate if {@link CstType} can have manual typification. */\nexport function canHaveManualTypification(type: CstType): boolean {\n switch (type) {\n case CstType.STRUCTURED:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Validate alias format for a given {@link CstType} (prefix + digits, min length 2). */\nexport function validateAliasFormat(alias: string, type: CstType): boolean {\n if (alias.length < 2) {\n return false;\n }\n const prefix = getCstTypePrefix(type);\n if (!alias.startsWith(prefix)) {\n return false;\n }\n if (!/^\\d+$/.exec(alias.substring(prefix.length))) {\n return false;\n }\n return true;\n}\n\n/** Validate new alias against {@link CstType} and {@link RSForm}. */\nexport function validateNewAlias(alias: string, type: CstType, schema: RSForm): boolean {\n if (!validateAliasFormat(alias, type)) {\n return false;\n }\n if (schema.cstByAlias.has(alias)) {\n return false;\n }\n return true;\n}\n\n/** Generate alias for new {@link Constituenta} of a given {@link CstType} for current {@link RSForm}. */\nexport function generateAlias(type: CstType, schema: RSForm, takenAliases: string[] = []): string {\n const prefix = getCstTypePrefix(type);\n if (schema.items.length <= 0) {\n return `${prefix}1`;\n }\n let index = schema.items.reduce((prev, cst, index) => {\n if (cst.cst_type !== type) {\n return prev;\n }\n index = Number(cst.alias.slice(1 - cst.alias.length)) + 1;\n return Math.max(prev, index);\n }, 1);\n let alias = `${prefix}${index}`;\n while (takenAliases.includes(alias)) {\n index = index + 1;\n alias = `${prefix}${index}`;\n }\n return alias;\n}\n\n/**\n * Id to pass as `insert_after` when creating a new {@link Constituenta} spawned by `targetId`:\n * after the last existing child of that spawner, or after the spawner itself if none.\n */\nexport function inferNewSpawnPosition(schema: RSForm, targetId: number): number {\n let last: number | null = null;\n for (const cst of schema.items) {\n if (cst.spawner === targetId) {\n last = cst.id;\n }\n }\n return last ?? targetId;\n}\n\n/** Sorts library items relevant for InlineSynthesis with specified {@link RSForm}. */\nexport function sortItemsForInlineSynthesis(receiver: RSForm, items: readonly LibraryItem[]): LibraryItem[] {\n const result = items.filter(item => item.location === receiver.location);\n for (const item of items) {\n if (item.visible && item.owner === item.owner && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (item.visible && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (!result.includes(item)) {\n result.push(item);\n }\n }\n return result;\n}\n\n/** Fields of {@link Constituenta} updated in place by alias mapping. */\nexport interface ConstituentaMappableFields {\n alias: string;\n definition_formal: string;\n typification_manual: string;\n term_raw: string;\n definition_raw: string;\n}\n\n/**\n * Remap formal expressions and terminological entity references in constituent fields.\n * Mutates each element of `items` in place; pass owned or cloned data only.\n */\nexport function applyMappingToConstituents<T extends ConstituentaMappableFields>(\n items: T[],\n mapping: AliasMapping,\n changeAliases: boolean\n): void {\n for (const cst of items) {\n if (changeAliases && cst.alias in mapping) {\n cst.alias = mapping[cst.alias];\n }\n cst.definition_formal = applyAliasMapping(cst.definition_formal, mapping);\n cst.typification_manual = applyTypificationMapping(cst.typification_manual, mapping);\n cst.term_raw = applyEntityReferenceMapping(cst.term_raw, mapping);\n cst.definition_raw = applyEntityReferenceMapping(cst.definition_raw, mapping);\n }\n}\n\n/** Remove alias from expression. */\nexport function removeAliasReference(expression: string, alias: string): string {\n const result = expression.replaceAll(new RegExp(`\\\\b${alias}\\\\b`, 'g'), 'DEL');\n return result === 'DEL' ? '' : result;\n}\n\n/** Add alias to expression. */\nexport function addAliasReference(expression: string, alias: string): string {\n return expression + ' ' + alias;\n}\n\n/** Returns expected {@link TypeClass} of formal definition for {@link CstType}. */\nexport function typeClassForCstType(cstType: CstType): TypeClass {\n switch (cstType) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.TERM:\n return TypeClass.typification;\n case CstType.FUNCTION:\n return TypeClass.function;\n case CstType.PREDICATE:\n return TypeClass.predicate;\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return TypeClass.logic;\n }\n}\n\n/** Checks whether a constituenta type supports formal definitions. */\nexport function canHaveFormalDefinition(cstType: CstType): boolean {\n return cstType !== CstType.BASE && cstType !== CstType.CONSTANT;\n}\n\n/** Analyze expression for {@link RSForm}. */\nexport function getAnalysisFor(expression: string, cstType: CstType, schema: RSForm, alias?: string): AnalysisFull {\n if (!canHaveFormalDefinition(cstType)) {\n if (expression.trim().length === 0) {\n const fallbackAlias = alias && alias.length > 0 ? alias : 'X0';\n const type = cstType === CstType.BASE ? bool(basic(fallbackAlias)) : bool(constant(fallbackAlias));\n return {\n success: true,\n type,\n valueClass: ValueClass.VALUE,\n errors: [],\n ast: null\n };\n }\n return {\n success: false,\n type: null,\n valueClass: null,\n errors: [\n {\n code: RSErrorCode.definitionNotAllowed,\n from: 0,\n to: Math.max(expression.length, 1),\n params: [cstType, alias ?? '']\n }\n ],\n ast: null\n };\n }\n return schema.analyzer.checkFull(expression, {\n expected: typeClassForCstType(cstType),\n isDomain: cstType === CstType.STRUCTURED\n });\n}\n\n/** Calculate statistics for {@link RSForm}. */\nexport function calculateSchemaStats(target: RSForm): RSFormStats {\n const items = target.items;\n return {\n count_all: items.length,\n count_crucial: items.reduce((sum, cst) => sum + (cst.crucial ? 1 : 0), 0),\n\n step_complexity: items.reduce((sum, cst) => sum + calculateStepComplexity(cst), 0),\n\n count_problematic: items.reduce((sum, cst) => sum + (isSchemaIssue(cst) ? 1 : 0), 0),\n count_homonyms: items.reduce((sum, cst) => sum + (cst.homonyms.length > 0 ? 1 : 0), 0),\n count_formal_duplicates: items.reduce((sum, cst) => sum + (cst.formalDuplicates.length > 0 ? 1 : 0), 0),\n count_missing_convention: items.reduce((sum, cst) => sum + (isMissingConvention(cst) ? 1 : 0), 0),\n count_type_mismatch: items.reduce((sum, cst) => sum + (cst.is_type_mismatch ? 1 : 0), 0),\n\n count_incorrect: items.reduce((sum, cst) => sum + (cst.status === CstStatus.INCORRECT ? 1 : 0), 0),\n count_property: items.reduce((sum, cst) => sum + (cst.analysis?.valueClass === ValueClass.PROPERTY ? 1 : 0), 0),\n count_incalculable: items.reduce(\n (sum, cst) => sum + (cst.analysis?.success && cst.analysis.valueClass === null ? 1 : 0),\n 0\n ),\n count_inherited: items.reduce((sum, cst) => sum + (cst.is_inherited ? 1 : 0), 0),\n\n count_text_term: items.reduce((sum, cst) => sum + (cst.term_raw ? 1 : 0), 0),\n count_definition: items.reduce((sum, cst) => sum + (cst.definition_raw ? 1 : 0), 0),\n count_convention: items.reduce((sum, cst) => sum + (isBasicConcept(cst.cst_type) && cst.convention ? 1 : 0), 0),\n count_comment: items.reduce((sum, cst) => sum + (!isBasicConcept(cst.cst_type) && !cst.convention ? 1 : 0), 0),\n\n count_base: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.BASE ? 1 : 0), 0),\n count_constant: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.CONSTANT ? 1 : 0), 0),\n count_structured: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.STRUCTURED ? 1 : 0), 0),\n count_axiom: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.AXIOM ? 1 : 0), 0),\n count_term: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.TERM ? 1 : 0), 0),\n count_function: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.FUNCTION ? 1 : 0), 0),\n count_predicate: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.PREDICATE ? 1 : 0), 0),\n count_statement: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.STATEMENT ? 1 : 0), 0),\n count_nominal: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.NOMINAL ? 1 : 0), 0)\n };\n}\n\n/** Finds {@link Constituenta} by structure path. */\nexport function findCstByStructure(schema: RSForm, target: Constituenta, path: TypePath): Constituenta | null {\n for (const cst of schema.items) {\n if (cst.spawner === target.id && cst.spawner_path) {\n if (cst.spawner_path.length === path.length && cst.spawner_path.every((v, i) => v === path[i])) {\n return cst;\n }\n }\n }\n return null;\n}\n\n/** Retrieves name for piece of target {@link Constituenta} structure. */\nexport function getStructureName(schema: RSForm, target: Constituenta, path: TypePath): string {\n const representation = findCstByStructure(schema, target, path);\n if (representation) {\n return `${representation.alias}: ${representation.term_resolved}`;\n }\n if (!isTypification(target.effectiveType)) {\n return '';\n }\n const type = applyPath(target.effectiveType as Typification, path);\n if (type?.typeID === TypeID.basic) {\n const cst = schema.cstByAlias.get(type.baseID);\n if (cst?.term_resolved) {\n return `${cst.alias}: ${cst.term_resolved}`;\n }\n }\n return '';\n}\n\n// ========= Internals =====\nfunction calculateStepComplexity(cst: Constituenta): number {\n if (cst.cst_type === CstType.AXIOM || cst.cst_type === CstType.NOMINAL || !isBasicConcept(cst.cst_type)) {\n return 0;\n }\n if (cst.cst_type === CstType.BASE || cst.cst_type === CstType.CONSTANT || !cst.effectiveType) {\n return 1;\n }\n\n const type = cst.effectiveType as Typification;\n return calculateTypificationComplexity(type) + 1;\n}\n\nfunction calculateTypificationComplexity(type: Typification): number {\n switch (type.typeID) {\n case TypeID.basic:\n case TypeID.integer:\n case TypeID.anyTypification:\n return 0;\n case TypeID.tuple:\n return (\n type.factors.length + type.factors.reduce((sum, factor) => sum + calculateTypificationComplexity(factor), 0)\n );\n case TypeID.collection:\n if (type.base.typeID === TypeID.tuple) {\n let sum = 0;\n type.base.factors.forEach(factor => {\n sum += calculateTypificationComplexity(factor);\n });\n return sum + type.base.factors.length;\n } else if (type.base.typeID === TypeID.collection) {\n return calculateTypificationComplexity(type.base) + 1;\n }\n return 0;\n }\n}\n\nfunction isMissingConvention(cst: Constituenta): boolean {\n if (isBasicConcept(cst.cst_type) && !isLogical(cst.cst_type)) {\n if (!cst.convention || !cst.term_resolved) {\n return true;\n }\n }\n return false;\n}\n\n/** Evaluate if {@link Typification} can be used to produce structure. */\nfunction typeCanProduceStructure(type: Typification): boolean {\n if (type.typeID === TypeID.basic || type.typeID === TypeID.integer || type.typeID === TypeID.anyTypification) {\n return false;\n } else if (type.typeID === TypeID.tuple) {\n return true;\n } else {\n return (\n type.base.typeID !== TypeID.basic &&\n type.base.typeID !== TypeID.integer &&\n type.base.typeID !== TypeID.anyTypification\n );\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -124,6 +124,10 @@ describe('applyEntityReferenceMapping', () => {
|
|
|
124
124
|
expect(applyEntityReferenceMapping('', { X1: 'X3' })).toBe('');
|
|
125
125
|
expect(applyEntityReferenceMapping('plain text', { X1: 'X3' })).toBe('plain text');
|
|
126
126
|
});
|
|
127
|
+
|
|
128
|
+
it('trims padded entity names when resolving aliases', () => {
|
|
129
|
+
expect(applyEntityReferenceMapping('@{ X1 |sing}', { X1: 'X3' })).toBe('@{X3|sing}');
|
|
130
|
+
});
|
|
127
131
|
});
|
|
128
132
|
|
|
129
133
|
describe('Testing reference resolution', () => {
|
|
@@ -138,10 +138,11 @@ export function applyEntityReferenceMapping(text: string, mapping: Record<string
|
|
|
138
138
|
let output = '';
|
|
139
139
|
for (const segment of text.matchAll(ENTITY_REFERENCE_PATTERN)) {
|
|
140
140
|
const entity = segment[1];
|
|
141
|
+
const entityKey = entity.trim();
|
|
141
142
|
const start = segment.index ?? 0;
|
|
142
|
-
if (
|
|
143
|
+
if (entityKey in mapping) {
|
|
143
144
|
output += text.substring(posInput, start + 2);
|
|
144
|
-
output += mapping[
|
|
145
|
+
output += mapping[entityKey];
|
|
145
146
|
output += text.substring(start + 2 + entity.length, start + segment[0].length);
|
|
146
147
|
posInput = start + segment[0].length;
|
|
147
148
|
}
|
|
@@ -70,4 +70,21 @@ describe('applyMappingToConstituents', () => {
|
|
|
70
70
|
expect(items[0].term_raw).toBe('@{X3|sing}');
|
|
71
71
|
expect(items[0].definition_raw).toBe('@{X4|sing}');
|
|
72
72
|
});
|
|
73
|
+
|
|
74
|
+
it('updates aliases when changeAliases is true', () => {
|
|
75
|
+
const items = [
|
|
76
|
+
{
|
|
77
|
+
alias: 'X1',
|
|
78
|
+
definition_formal: 'X1',
|
|
79
|
+
typification_manual: '',
|
|
80
|
+
term_raw: '',
|
|
81
|
+
definition_raw: ''
|
|
82
|
+
}
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
applyMappingToConstituents(items, { X1: 'X3' }, true);
|
|
86
|
+
|
|
87
|
+
expect(items[0].alias).toBe('X3');
|
|
88
|
+
expect(items[0].definition_formal).toBe('X3');
|
|
89
|
+
});
|
|
73
90
|
});
|
|
@@ -341,7 +341,7 @@ export function sortItemsForInlineSynthesis(receiver: RSForm, items: readonly Li
|
|
|
341
341
|
return result;
|
|
342
342
|
}
|
|
343
343
|
|
|
344
|
-
/** Fields of {@link Constituenta}
|
|
344
|
+
/** Fields of {@link Constituenta} updated in place by alias mapping. */
|
|
345
345
|
export interface ConstituentaMappableFields {
|
|
346
346
|
alias: string;
|
|
347
347
|
definition_formal: string;
|
|
@@ -350,7 +350,10 @@ export interface ConstituentaMappableFields {
|
|
|
350
350
|
definition_raw: string;
|
|
351
351
|
}
|
|
352
352
|
|
|
353
|
-
/**
|
|
353
|
+
/**
|
|
354
|
+
* Remap formal expressions and terminological entity references in constituent fields.
|
|
355
|
+
* Mutates each element of `items` in place; pass owned or cloned data only.
|
|
356
|
+
*/
|
|
354
357
|
export function applyMappingToConstituents<T extends ConstituentaMappableFields>(
|
|
355
358
|
items: T[],
|
|
356
359
|
mapping: AliasMapping,
|