Documentazione Completa
SLIPS (Swift Language Implementation of Production Systems) Γ¨ una traduzione semantica fedele di CLIPS 6.4.2 in Swift 6.2. Il progetto mantiene la filosofia, gli algoritmi e l'architettura originale di CLIPS, adattandola alle caratteristiche di sicurezza e tipo del linguaggio Swift moderno.
CLIPS (C Language Integrated Production System) Γ¨ un expert system shell sviluppato dalla NASA. Utilizza un motore a regole basato sull'algoritmo RETE per il pattern matching efficiente e supporta programmazione procedurale, orientata agli oggetti e guidata da regole.
Aggiungi SLIPS al tuo Package.swift:
dependencies: [
.package(url: "https://github.com/gpicchiarelli/SLIPS.git", from: "0.1.0")
]
import SLIPS
// Crea un environment
let env = CLIPS.createEnvironment()
// Definisci un template
CLIPS.eval(expr: """
(deftemplate persona
(slot nome)
(slot etΓ (type INTEGER)))
""")
// Definisci una regola
CLIPS.eval(expr: """
(defrule saluta-adulto
(persona (nome ?n) (etΓ ?e&:(>= ?e 18)))
=>
(printout t "Ciao " ?n ", sei maggiorenne!" crlf))
""")
// Asserisci fatti
CLIPS.eval(expr: "(assert (persona (nome \"Mario\") (etΓ 25)))")
CLIPS.eval(expr: "(assert (persona (nome \"Luigi\") (etΓ 16)))")
// Esegui le regole
let fired = CLIPS.run(limit: nil)
print("Regole eseguite: \(fired)")
swift run slips-cli
SLIPS> (facts)
SLIPS> (rules)
SLIPS> (run)
| C (CLIPS) | Swift (SLIPS) |
|---|---|
struct |
struct |
union + type tag |
enum con associated values |
#define macro |
static let o computed property |
malloc/free |
Array, Dictionary, ARC |
| Puntatori | Reference types, Unsafe* quando necessario |
Sources/SLIPS/
βββ Core/ (32 file, ~11.500 LOC)
β βββ envrnmnt.swift (environment.c)
β βββ evaluator.swift (evaluatn.c)
β βββ ruleengine.swift (engine.c + factmngr.c)
β βββ expressn.swift (expressn.c)
β βββ scanner.swift (scanner.c)
β βββ router.swift (router.c)
β βββ Modules.swift (moduldef.c) β
β βββ MultifieldFunctions.swift (multifun.c) β
β βββ StringFunctions.swift (strngfun.c) β
β βββ MathFunctions.swift (emathfun.c) β
β βββ TemplateFunctions.swift (tmpltfun.c) β
NEW!
β βββ IOFunctions.swift (iofun.c) β
β βββ FactQueryFunctions.swift (factqpsr.c) β
β βββ UtilityFunctions.swift (miscfun.c) β
β βββ PrettyPrintFunctions.swift β
β βββ functions.swift (160+ built-in)
βββ Rete/ (12 file, ~2.800 LOC)
β βββ AlphaNetwork.swift (alpha memory)
β βββ BetaEngine.swift (beta network)
β βββ DriveEngine.swift (drive.c)
β βββ NetworkBuilder.swift(rulebld.c)
β βββ Propagation.swift (incremental updates)
β βββ Nodes.swift (nodi RETE espliciti)
βββ Agenda/ (1 file, ~150 LOC)
β βββ Agenda.swift (agenda.c + focus stack)
βββ CLIPS.swift (facciata pubblica)
Totale: 46 file, 15.200+ LOC
SLIPS ora include il set completo di funzioni per manipolare e interrogare i template,
tradotte fedelmente da tmpltfun.c di CLIPS 6.4.2.
;; Modifica fatto esistente
(assert (person (name "John") (age 30))) ; f-1
(modify 1 (age 31)) ; Aggiorna etΓ
;; Duplica con modifiche
(duplicate 1 (name "Jane")) ; f-2: Jane, 31 anni
(duplicate 1 (name "Bob") (age 25)) ; f-3: Bob, 25 anni
;; Lista slot di un template
(deftemplate-slot-names person)
; β (create$ name age)
;; Valore default di uno slot
(deftemplate-slot-default-value person age)
; β 0 (o il default specificato)
;; Check tipo slot
(deftemplate-slot-multip project team-members)
; β TRUE (Γ¨ multifield)
(deftemplate-slot-singlep person name)
; β TRUE (Γ¨ single-field)
;; Check esistenza slot
(deftemplate-slot-existp person salary)
; β FALSE (lo slot non esiste)
tmpltfun.c
sono state implementate e testate (24 test, 100% pass rate).
SLIPS supporta ora il sistema completo di moduli di CLIPS per organizzare regole e fatti in namespace separati.
;; Crea modulo con export
(defmodule UTILITIES
(export deftemplate data-record)
(export defrule process-data))
;; Crea modulo con import
(defmodule MAIN
(import UTILITIES deftemplate data-record))
;; Imposta focus su modulo (LIFO stack)
(focus UTILITIES)
;; Focus su piΓΉ moduli
(focus MODULE-A MODULE-B MODULE-C)
;; Ottieni modulo corrente
(get-current-module) ; Ritorna MAIN
;; Cambia modulo corrente
(set-current-module UTILITIES)
;; Lista tutti i moduli
(list-defmodules)
; Output:
; MAIN
; UTILITIES
; MODULE-A
;; Ottieni lista come multifield
(get-defmodule-list)
; Ritorna: (MAIN UTILITIES MODULE-A)
;; Agenda per modulo specifico
(agenda UTILITIES)
// Creazione environment
static func createEnvironment() -> Environment
// Caricamento file
static func load(_ path: String) -> Bool
// Reset environment
static func reset()
// Esecuzione regole
static func run(limit: Int?) -> Int
// Assert fatti
static func assert(fact: String) -> Int
// Retract fatti
static func retract(id: Int) -> Bool
// Valutazione espressioni
static func eval(expr: String) -> Value
// Command loop interattivo
static func commandLoop()
struct Environment {
var facts: [Int: FactRec] // Base di fatti
var rules: [Rule] // Regole definite
var templates: [String: Template] // Template deftemplate
var agendaQueue: AgendaQueue // Coda attivazioni
var rete: ReteNetwork // Rete RETE
var watchFacts: Bool // Watch fatti
var watchRules: Bool // Watch regole
var experimentalJoinCheck: Bool // Beta engine sperimentale
}
enum Value: Codable, Equatable {
case none
case int(Int64)
case float(Double)
case string(String)
case symbol(String)
case boolean(Bool)
case multifield([Value])
case factAddress(Int)
case instanceAddress(String)
case externalAddress(String)
}
(deftemplate problema
(slot tipo)
(slot descrizione))
(deftemplate sintomo
(slot nome)
(slot gravitΓ (type INTEGER)))
(defrule diagnosi-batteria
(sintomo (nome "motore-non-parte"))
(sintomo (nome "luci-deboli"))
=>
(assert (problema
(tipo "batteria-scarica")
(descrizione "La batteria necessita ricarica o sostituzione")))
(printout t "Diagnosi: Batteria scarica" crlf))
(defrule diagnosi-alternatore
(problema (tipo "batteria-scarica"))
(sintomo (nome "batteria-si-scarica-rapidamente"))
=>
(printout t "Possibile guasto alternatore" crlf))
(deftemplate ordine
(slot id)
(slot cliente)
(slot importo (type FLOAT))
(slot urgente (type SYMBOL)))
(defrule ordine-prioritario
(ordine (id ?id)
(cliente ?c)
(importo ?i&:(> ?i 1000.0))
(urgente SI))
=>
(printout t "PRIORITΓ ALTA: Ordine " ?id
" da " ?c " per β¬" ?i crlf))
(defrule sconto-cliente-fedele
(ordine (id ?id) (cliente ?c) (importo ?i))
(cliente-premium (nome ?c) (anni ?a&:(>= ?a 5)))
=>
(bind ?sconto (* ?i 0.15))
(printout t "Sconto 15% per " ?c ": β¬" ?sconto crlf))
(defrule cliente-senza-ordini
(cliente (id ?id) (nome ?n))
(not (ordine (cliente-id ?id)))
=>
(printout t "Cliente " ?n " non ha mai ordinato" crlf))
(defrule stock-esaurito
(prodotto (codice ?c) (nome ?n))
(not (magazzino (prodotto ?c) (quantitΓ ?q&:(> ?q 0))))
=>
(printout t "ALERT: " ?n " esaurito!" crlf))
Il RETE Γ¨ un algoritmo di pattern matching sviluppato da Charles Forgy nel 1979. Ottimizza il matching di regole evitando di ricontrollare condizioni invariate ad ogni ciclo.
// Abilita confronto tra backtracking classico e beta engine
CLIPS.eval(expr: "(set-join-check on)")
// Verifica lo stato
let status = CLIPS.eval(expr: "(get-join-check)")
// Ritorna: boolean(true)
Quando join-check Γ¨ attivo, SLIPS esegue entrambi gli algoritmi
e logga eventuali divergenze su STDERR. Questo aiuta a validare l'implementazione incrementale.
Consulta il file AGENTS.md nella root del repository per le regole complete. In sintesi:
.c/.h β .swift corrispondenteguard let e pattern matchinggit clone https://github.com/gpicchiarelli/SLIPS.git
cd SLIPS
swift build
swift test
# Tutti i test (275+)
swift test
# Test specifico
swift test --filter TemplateFunctionsTests
swift test --filter ModuleAwareAgendaTests
# Con verbose
swift test --verbose
# Risultati: 274/275 pass (99.6%) β
Riferimento sorgenti CLIPS originali:
clips_core_source_642/core/
βββ agenda.c/h β Agenda/Agenda.swift β
βββ drive.c/h β Rete/BetaEngine.swift π§
βββ pattern.c/h β (da tradurre)
βββ reteutil.c/h β (da tradurre)
βββ network.c/h β (da tradurre)
βββ ...
Consulta ROADMAP_TO_1.0_UPDATED.md per la pianificazione dettagliata:
Stato attuale: 96% completezza, production-ready! Manca solo documentazione finale.