package main
import (
"fmt"
"strings"
"sync"
"time"
)
// ПАРАМЕТРЫ СИСТЕМЫ
const (
MEMORY_DECAY = 0.95 // Скорость забывания шума
LEARNING_RATE = 0.6 // Сила запоминания
CRYSTAL_THRESHOLD = 2.5 // Порог превращения в "вечную память"
GARBAGE_LIMIT = 0.1 // Уровень удаления мусора
)
type Node struct {
ID string
Connections map[string]float64
mu sync.Mutex
}
type Brain struct {
Nodes map[string]*Node
mu sync.Mutex
}
var brain = &Brain{Nodes: make(map[string]*Node)}
func main() {
fmt.Println("? ЗАПУСК АНТИ-ГАЛЛЮЦИНАТОРА (Vserod Core)")
fmt.Println("Инструкция:")
fmt.Println("1. Вводите любые фразы (например: 'cat eats fish').")
fmt.Println("2. Повторите важную фразу 3-4 раза, чтобы она запомнилась навсегда.")
fmt.Println("3. Введите 'show' для просмотра памяти, 'quit' для выхода.")
fmt.Println("---")
go decayLoop() // Запуск процесса очистки от шума
for {
var input string
fmt.Print("\n> ")
if _, err := fmt.Scanln(&input); err != nil {
continue
}
if strings.ToLower(input) == "quit" {
break
} if strings.ToLower(input) == "show" {
printMemory()
continue
}
learn(input)
}
}
func learn(phrase string) {
words := strings.Fields(strings.ToLower(phrase))
if len(words) < 2 {
fmt.Println("⚠ Слишком коротко для создания связи.")
return
}
brain.mu.Lock()
defer brain.mu.Unlock()
for i := 0; i < len(words); i++ {
w1 := words
if brain.Nodes[w1] == nil {
brain.Nodes[w1] = &Node{ID: w1, Connections: make(map[string]float64)}
}
// Создаем связи с соседними словами
for j := i + 1; j < len(words) && j < i+3; j++ {
w2 := words[j]
if brain.Nodes[w2] == nil {
brain.Nodes[w2] = &Node{ID: w2, Connections: make(map[string]float64)}
}
// Укрепление связи
n1 := brain.Nodes[w1]
n1.mu.Lock()
n1.Connections[w2] += LEARNING_RATE
if n1.Connections[w2] > CRYSTAL_THRESHOLD {
// Только что кристаллизовалось
if n1.Connections[w2]-LEARNING_RATE <= CRYSTAL_THRESHOLD {
fmt.Printf("✨ ЗАПОМНЕНО НАВСЕГДА: связь [%s] <-> [%s]\n", w1, w2)
}
}
n1.mu.Unlock()
}
}
}
func decayLoop() {
for {
time.Sleep(2 * time.Second) brain.mu.Lock()
for id, node := range brain.Nodes {
node.mu.Lock()
toRemove := []string{}
for target, weight := range node.Connections {
newWeight := weight * MEMORY_DECAY
if newWeight < GARBAGE_LIMIT {
toRemove = append(toRemove, target)
} else {
node.Connections[target] = newWeight
}
}
for _, t := range toRemove {
delete(node.Connections, t)
}
if len(node.Connections) == 0 {
delete(brain.Nodes, id)
}
node.mu.Unlock()
}
brain.mu.Unlock()
}
}
func printMemory() {
brain.mu.Lock()
defer brain.mu.Unlock()
fmt.Println("\n? ТЕКУЩАЯ ПАМЯТЬ (Устойчивые связи):")
found := false
for id, node := range brain.Nodes {
node.mu.Lock()
for target, weight := range node.Connections {
if weight > 1.0 {
fmt.Printf("[%s] --(%.2f)--> [%s]\n", id, weight, target)
found = true
}
}
node.mu.Unlock()
}
if !found {
fmt.Println("(Память пуста или содержит только временный шум)")
}
}