Improve derivation check algorithm

This commit is contained in:
IRBorisov 2024-04-05 22:36:20 +03:00
parent 2fbbec0466
commit 16252b2145
4 changed files with 29 additions and 4 deletions

View File

@ -53,6 +53,9 @@ export function loadRSFormData(input: IRSFormData): IRSForm {
// Calculate derivation of constituents based on formal definition analysis // Calculate derivation of constituents based on formal definition analysis
result.graph.topologicalOrder().forEach(id => { result.graph.topologicalOrder().forEach(id => {
const cst = result.items.find(item => item.id === id)!; const cst = result.items.find(item => item.id === id)!;
if (cst.cst_type === CstType.STRUCTURED) {
return;
}
const resolvedInput: Set<ConstituentaID> = new Set(); const resolvedInput: Set<ConstituentaID> = new Set();
let definition = ''; let definition = '';
if (!isFunctional(cst.cst_type)) { if (!isFunctional(cst.cst_type)) {
@ -62,13 +65,34 @@ export function loadRSFormData(input: IRSFormData): IRSForm {
} else { } else {
const expression = splitTemplateDefinition(cst.definition_formal); const expression = splitTemplateDefinition(cst.definition_formal);
definition = expression.body; definition = expression.body;
const dependencies = extractGlobals(definition); const bodyDependencies = extractGlobals(definition);
dependencies.forEach(alias => { bodyDependencies.forEach(alias => {
const targetCst = result.items.find(item => item.alias === alias); const targetCst = result.items.find(item => item.alias === alias);
if (targetCst) { if (targetCst) {
resolvedInput.add(derivationLookup.get(targetCst.id)!); resolvedInput.add(derivationLookup.get(targetCst.id)!);
} }
}); });
const needCheckHead = () => {
if (resolvedInput.size === 0) {
return true;
} else if (resolvedInput.size !== 1) {
return false;
} else {
const base = result.items.find(item => item.id === resolvedInput.values().next().value)!;
return (
!isFunctional(base.cst_type) || splitTemplateDefinition(base.definition_formal).head !== expression.head
);
}
};
if (needCheckHead()) {
const headDependencies = extractGlobals(expression.head);
headDependencies.forEach(alias => {
const targetCst = result.items.find(item => item.alias === alias);
if (targetCst && !isBaseSet(targetCst.cst_type)) {
resolvedInput.add(derivationLookup.get(targetCst.id)!);
}
});
}
} }
if (resolvedInput.size === 1 && isSimpleExpression(definition)) { if (resolvedInput.size === 1 && isSimpleExpression(definition)) {
const parent = result.items.find(item => item.id === resolvedInput.values().next().value)!; const parent = result.items.find(item => item.id === resolvedInput.values().next().value)!;

View File

@ -22,6 +22,7 @@ const simpleExpressionData = [
['(X1)', 'false'], ['(X1)', 'false'],
['(X1)', 'false'], ['(X1)', 'false'],
['D{(α,β)∈D6×D6 | α≠β & α∩β≠∅}', 'false'], ['D{(α,β)∈D6×D6 | α≠β & α∩β≠∅}', 'false'],
['D{ξ ∈ X1 | (ξ,ξ)∈S1 }', 'false'],
['I{(β,α) | α:∈D2; σ:=F5[α]; β:∈σ}', 'false'], ['I{(β,α) | α:∈D2; σ:=F5[α]; β:∈σ}', 'false'],
['∀σ∈S1 (F1[σ]×F1[σ])∩D11=∅', 'false'] ['∀σ∈S1 (F1[σ]×F1[σ])∩D11=∅', 'false']
]; ];

View File

@ -29,7 +29,7 @@ function ConstituentaToolbar({
onCreate onCreate
}: ConstituentaToolbarProps) { }: ConstituentaToolbarProps) {
return ( return (
<Overlay position='top-1 right-4 sm:right-1/2 sm:translate-x-1/2' className='cc-icons'> <Overlay position='top-1 right-4' className='cc-icons sm:right-1/2 sm:translate-x-1/2'>
<MiniButton <MiniButton
titleHtml={prepareTooltip('Сохранить изменения', 'Ctrl + S')} titleHtml={prepareTooltip('Сохранить изменения', 'Ctrl + S')}
icon={<IconSave size='1.25rem' className='icon-primary' />} icon={<IconSave size='1.25rem' className='icon-primary' />}

View File

@ -97,7 +97,7 @@ function EditorConstituenta({ activeCst, isModified, setIsModified, onOpenEdit }
className={clsx( className={clsx(
'max-w-[95rem]', // prettier: split lines 'max-w-[95rem]', // prettier: split lines
'flex', 'flex',
{ 'flex-col items-center': isNarrow } { 'flex-col md:items-center': isNarrow }
)} )}
onKeyDown={handleInput} onKeyDown={handleInput}
> >