Skip to main content
Glama
analogical-reasoning.ts6.31 kB
/** * Analogical Reasoning Operation * * Finds and applies analogies to understand complex problems through familiar domains */ import { BaseOperation, type OperationContext, type OperationResult } from '../base.js'; import type { AnalogyMapping, AnalogicalReasoningData } from '../../../types/index.js'; export class AnalogicalReasoningOperation extends BaseOperation { name = 'analogical_reasoning'; category = 'analysis'; async execute(context: OperationContext): Promise<OperationResult> { const { sessionState, prompt, parameters } = context; const sourceDomain = this.getParam(parameters, 'sourceDomain', ''); const targetDomain = this.getParam(parameters, 'targetDomain', prompt); const existingMappings = (parameters.mappings as AnalogyMapping[]) || []; const autoGenerate = this.getParam(parameters, 'autoGenerate', true); let mappings = existingMappings; let inferredInsights: string[] = []; // Generate mappings if none provided and auto-generation is enabled if (mappings.length === 0 && autoGenerate && sourceDomain) { mappings = this.generateMappings(sourceDomain, targetDomain); } // Generate insights from mappings if (mappings.length > 0) { inferredInsights = this.generateInsights(mappings, sourceDomain, targetDomain); } // Suggest analogies if no source domain provided const suggestedAnalogies = sourceDomain ? [] : this.suggestAnalogies(targetDomain); const reasoningData: AnalogicalReasoningData = { sourceDomain: sourceDomain || '[To be determined]', targetDomain, mappings, inferredInsights, sessionId: sessionState.sessionId, }; return this.createResult({ ...reasoningData, suggestedAnalogies, mappingStrength: this.calculateOverallStrength(mappings), nextSteps: this.generateNextSteps(mappings, inferredInsights), sessionContext: { sessionId: sessionState.sessionId, stats: sessionState.getStats(), }, }); } private generateMappings(sourceDomain: string, targetDomain: string): AnalogyMapping[] { const mappings: AnalogyMapping[] = []; // Common mapping patterns based on domain keywords const sourceKeywords = this.extractKeywords(sourceDomain); const targetKeywords = this.extractKeywords(targetDomain); // Generate role mappings if (sourceKeywords.length > 0 && targetKeywords.length > 0) { mappings.push({ sourceConcept: sourceKeywords[0], targetConcept: targetKeywords[0], mappingType: 'role', strength: 0.7 }); } // Generate structural mappings mappings.push({ sourceConcept: `Structure of ${sourceDomain}`, targetConcept: `Structure of ${targetDomain}`, mappingType: 'structure', strength: 0.6 }); // Generate behavioral mappings mappings.push({ sourceConcept: `Behavior patterns in ${sourceDomain}`, targetConcept: `Behavior patterns in ${targetDomain}`, mappingType: 'behavior', strength: 0.5 }); return mappings; } private generateInsights(mappings: AnalogyMapping[], sourceDomain: string, targetDomain: string): string[] { const insights: string[] = []; // Insights from strong mappings const strongMappings = mappings.filter(m => (m.strength || 0) > 0.6); if (strongMappings.length > 0) { insights.push(`Strong parallels exist between ${sourceDomain} and ${targetDomain}`); } // Type-specific insights const roleMappings = mappings.filter(m => m.mappingType === 'role'); if (roleMappings.length > 0) { insights.push(`Key roles in ${sourceDomain} can inform understanding of ${targetDomain}`); } const structuralMappings = mappings.filter(m => m.mappingType === 'structure'); if (structuralMappings.length > 0) { insights.push(`Structural similarities suggest similar organizing principles`); } const behaviorMappings = mappings.filter(m => m.mappingType === 'behavior'); if (behaviorMappings.length > 0) { insights.push(`Behavioral patterns from ${sourceDomain} may predict ${targetDomain} dynamics`); } return insights; } private suggestAnalogies(targetDomain: string): string[] { const suggestions: string[] = []; const keywords = this.extractKeywords(targetDomain.toLowerCase()); // Domain-specific analogy suggestions if (keywords.some(k => ['business', 'organization', 'company'].includes(k))) { suggestions.push('Military strategy', 'Ecosystem dynamics', 'Sports team coordination'); } else if (keywords.some(k => ['system', 'network', 'connection'].includes(k))) { suggestions.push('Neural networks', 'Transportation systems', 'Social networks'); } else if (keywords.some(k => ['problem', 'challenge', 'issue'].includes(k))) { suggestions.push('Medical diagnosis', 'Detective investigation', 'Engineering design'); } else { suggestions.push('Machine operation', 'Natural processes', 'Game mechanics'); } return suggestions; } private extractKeywords(text: string): string[] { return text.split(/\s+/) .filter(word => word.length > 3) .map(word => word.toLowerCase()) .slice(0, 5); } private calculateOverallStrength(mappings: AnalogyMapping[]): number { if (mappings.length === 0) return 0; const totalStrength = mappings.reduce((sum, m) => sum + (m.strength || 0), 0); return totalStrength / mappings.length; } private generateNextSteps(mappings: AnalogyMapping[], insights: string[]): string[] { const steps: string[] = []; if (mappings.length === 0) { steps.push('Identify a source domain with familiar structures or patterns'); steps.push('Map key elements between source and target domains'); } else { steps.push('Strengthen weak mappings by finding additional correspondences'); if (insights.length > 0) { steps.push('Test insights by looking for counter-examples or exceptions'); } steps.push('Apply learned patterns to predict target domain behavior'); } return steps; } } export default new AnalogicalReasoningOperation();

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/waldzellai/clearthought-onepointfive'

If you have feedback or need assistance with the MCP directory API, please join our Discord server