I seguenti commenti indirizzano la domanda in un ordine che va approssimativamente da "più specifico" a "più generale".
In primo luogo, affrontando il tuo commento concreta:
avrei fatto uso di un hash table/dizionario, ma per quanto ne so questo non è davvero possibile in Prolog.
Tutte le implementazioni seria di Prolog consentono di modificare in modo distruttivo i termini di Prolog, utilizzando ad esempio setarg/3
. L'utilizzo di arg/3
e setarg/3
fornisce l'accesso O (1) a ciascun argomento di un termine, che è sufficiente per implementare una tabella di hash esattamente come in altri linguaggi, presupponendo che il proprio sistema non ponga limiti arbitrari alle proprietà dei termini.
Non è una buona idea farlo da soli, poiché è necessario prendere in considerazione la copia imprevista e la condivisione di termini a tutti i termini. Invece, affidati alle librerie per farlo.
Quali librerie? I secondi ciò che altri hanno scritto: Invece di hashing biblioteche, utilizzare basati su alberi librerie come library(assoc)
, library(avl)
ecc Questi non sono abbastanza efficiente come hash nel caso medio, ma:
- sono spesso efficaci abbastanza
- scalabili in modo molto prevedibile: operazioni più importanti sono sempre in O (log (n)).
anche come altri hanno scritto, modifiche distruttive sono incompatibili con la programmazione logica, e le librerie degli alberi hanno il grande vantaggio di poter essere implementate in ISO Prolog e in modopuro con asintoticamente efficienza ottimale.
Infine, le estensioni di dict SWI-Prolog sono non conforme ISO, nemmeno sintatticamente, e quindi non conforme portatile per sistemi Prolog! Vedere Ulrich Neumerkel comments per come un punto infisso può essere aggiunto in un modo conforme ISO.
Ho appena visto che il suo era successo di recente - cambiando per essere la risposta accettata. Dovevamo solo aspettare qualche anno per essere sviluppato. – nedned