<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FireTeam</title>
	<atom:link href="http://www.fireteam.it/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fireteam.it</link>
	<description>#fuoco@AzzurraNet</description>
	<lastBuildDate>Tue, 16 Mar 2010 15:55:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SpeedUp Debian Boot</title>
		<link>http://www.fireteam.it/2010/03/speedup-debian-boot/</link>
		<comments>http://www.fireteam.it/2010/03/speedup-debian-boot/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 15:55:56 +0000</pubDate>
		<dc:creator>Paco</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[debian]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=813</guid>
		<description><![CDATA[In un epoca in cui si usano calcolatori che compiono milioni di flop  al secondo, è alquanto paradossale dover attendere una vita per il boot  della propria macchina; questa problematica risulta irrilevante se si  utilizza il calcolatore come server in quanto non si è costretti a  continui avvii del computer, ma [...]]]></description>
			<content:encoded><![CDATA[<p>In un epoca in cui si usano calcolatori che compiono milioni di flop  al secondo, è alquanto paradossale dover attendere una vita per il boot  della propria macchina; questa problematica risulta irrilevante se si  utilizza il calcolatore come server in quanto non si è costretti a  continui avvii del computer, ma è sentita dagli utenti desktop e  soprattutto dalle persone che utilizzano un notebook.<br />
In questa guida  cercherò, senza garanzie e senza pretese, di fornire qualche consiglio  utile basato sulla mia esperienza su come ridurre I tempi di boot.<br />
Prima  di iniziare però gradirei fare due premesse: prima di tutto ci tengo a  precisare che I seguenti consigli non sono esclusivamente farina del mio  sacco, ma il 50% è preso in giro da internet; mi sarebbe piaciuto  fornire I link dai quali mi sono documentato ma purtroppo preso dalla  foga del momento ho dimenticato di salvarli. In secondo luogo vorrei  aggiungere che ci sono altri metodi per accedere in modo più veloce del  solito al proprio ambiente di lavoro (vedi la sospensione su disco) ma  questa guida ha come scopo quello di ridurre I tempi di un “normale”  boot di un computer “general purpose”.</p>
<p><span id="more-813"></span></p>
<div><strong>NB</strong><br />
L&#8217;autore  non si ritiene responsabili per eventuali danni causati al sistema  operativo o per eventuali perdite di dati.<br />
Qualsiasi commento, nota o  correzione è ben accetto.</div>
<p>Prima di tutto forniamo un pò  di informazioni sulla macchina cavia, in modo da fornire un termine di  paragone per I risoltati; la macchina in questione è un pò vecchiotta in  quanto viene utilizzata essenzialmente per smanettarci:</p>
<div>
<strong>CPU</strong>:  Intel Pentium III (Coppermine) 600  Mhz<br />
<strong>Cache</strong>: 256 KB<br />
<strong>RAM</strong>: 252 MB<br />
<strong>SWAP</strong>: 512MB<br />
<strong>Filesystem</strong>:  ext3 sia per root direcory che per le home (dicono che reiserfs  garantisca prestazioni migliori, ma con quello che è successo al suo  creatore non credo che lo sviluppo continuerà)<br />
<strong>Sitema Operativo</strong>:  GNU/Linux Debian sid con Server Grafico attivato e LXDE come Desktop  Environment.</div>
<p>Il sistema in questione è stato installato  tramite net-install e selezionando I seguenti gruppi di pacchetti:</p>
<div>
- Desktop environment<br />
- Print server<br />
-  Standard system</div>
<div>
<strong>NB</strong><br />
Installare  più o meno software rispetto a quello utilizzato in questa guida può  naturalmente influire sui tempi di boot in quanto cambia il set di  demoni avviati al primo boot della macchina</div>
<p>Procediamo  fornendo una panoramica sulla modalità di boot del PC ed in particolare  dei sistemi GNU/Linux.<br />
Il primo elemento che entra in esecuzione è il  BIOS (Basic Input/Output System) ovverro un programma che risiede in un  chip della scheda madre che si occupa di riconoscere una parte  dell&#8217;hardware (generalmente il processore, I lettori ottici e I dischi  fissi). Una volta finita la ricognizione dell&#8217;hardware il BIOS legge  l&#8217;MBR (Master Boot Record) del disco di avvio pemettendo così il  caricamento del boot loader ovvero quel software che vi permette di  scegliere il sistema operativo da avviare.<br />
La maggior parte delle  distribuzioni di Linux permette di scegliere tra LILO (LInux LOader)  e  GRUB<br />
(GRand Unified Bootloader); Debian di default utilizza GRUB.<br />
Il  boot loader si occupa di caricare il kernel scelto nella memoria ram.<br />
A  questo punto il kernel Linux acquisisce il controllo e, in un sistema  Debian, avvia init (pacchetto sysvinit). Init è semplicemente un  sofwtare che seguendo un elenco più o meno ordinato avvia un insieme di  demoni tra I quali (nel caso in cui si utilizzi un greeting grafico)  GDM, KDM o altri.<br />
Riassumendo, graficamente la procedura di boot può  essere rappresentata dalla seguente linea temporale:<br />
<img src="http://dmp.altervista.org/img/GUIDE/lineaboot.png" alt="" /><br />
A  tal proposito ho ritenuto utile suddividere la guida in 4 parti, ognuna  delle quali è dedicata ad una specifica fase della procedura di boot.</p>
<div>Punto 1 &#8211; I giusti parametri del BIOS</div>
<p>Sebbene  la maggior parte delle moderne schede madre sono equipaggiate da BIOS  che permettono personalizzazioni davvero minime, è consigliabile  effettuare tutto il possibile per fare in modo che il tempo che va tra  l&#8217;accenzione del computer ed il caricamento del boot loader sia ridotto  all&#8217;osso.<br />
Sebbene sia consigliabile utilizzare la versione più  recente per il proprio BIOS, questa è un&#8217;operazione ad alto rischio in  quanto, come sicuramente saprete, può compromettere il funzionamento  della scheda madre; mi sento quindi di consigliarla esclusimanete ad  utenti di PC quali HP e TOSHIBA (ce ne saranno altri ma io conosco  questi) che forniscono sul proprio sito un utility per flashare il BIOS  all&#8217;ultima versione disponibile. Premetto che però tali utility vengono  sviluppate per essere eseguite sotto Windows (presumo solo per scopi  commerciali) quindi è un&#8217;operazione che vi consiglio di fare prima di  installare Linux; nel caso in cui Linux già sia presente sul vostro PC,  se disponete di un ampia partizione di swap, potreste provare ad  installare temporaneamente Windows su tale partizione (che diventerebbe  NTFS o FAT32), lasciando così illese sia la partizione di root che le  home.</p>
<div>
<strong>NB</strong><br />
Installare Windows  sulla partizione di swap comporta comunque la cancellazione di GRUB dal  MBR e la perdita di un&#8217;eventuale sessione salvata tramite la sospensione  su disco.</div>
<p>Per quanto riguarda I parametri se  utilizzare un BIOS Award come quello della macchina in questione avete  ampi margini di smanettamento (vi rimando a google per le guide a  proposito) altrimenti una cosa che sicuramente potete fare è selezionare  l&#8217;unità dove risiede GRUB come la prima da avviare; in caso contrario  il BIOS controllerà prima la presenza di eventuali CD/DVD nel lettore  ottico o se è possibile (nei modelli che lo prevedono) effettuare il  boot da LAN.</p>
<div>Punto 2– Configurazione del  Boot Loader</div>
<p>Lo scopo di questa sezione è ridurre il tempo  necessario a GRUB per avviare il caricamento del kernel. Purtroppo anche  qui non abbiamo la possibilità di fare tanto se non tentare di  diminuire al minimo l&#8217;interazione di GRUB con l&#8217;utente.<br />
Se infatti  avviamo la nostra macchina sempre e solo con lo stesso kernel e se non  abbiamo altri sistemi operativi installati, possiamo dire a GRUB di non  mostrare la schermata con la lista dei sistemi operativi disponibili e  di diminuire a zero l&#8217;attesa che di solito viene impiegata per dare  all&#8217;utente l&#8217;opportunità di scegliere cosa avviare.<br />
A tal proposito  bisogna procedere con la modifica del file /boot/grub/menu.lst settando a  0 (zero) la voce <strong>timeout</strong> e decommentando la linea.</p>
<div>Punto 3.1 – Installare il  Kernel giusto</div>
<p>Inutile dire che l&#8217;ideale sarebbe compilare il  kernel a mano ed eliminare tutto quello che non ci occorre (compresa l&#8217;  Initial RamDisk Image), ma sono dell&#8217;opinione che è una cosa alquanto  tediosa da fare esclusivamente per sistemi embendeed; resta comunque il  fatto che almeno una volta nella vita è un&#8217;esperienza che un utente  Linux DEVE fare perchè consente di conoscere infiniti concetti che  altrimenti resterebbero ignoti.<br />
Utilizzeremo quindi il parco kernel  fornito da mamma Debian: quello che dobbiamo fare è scegliere il kernel  specifico per la nostra architettura, nel mio caso essendo un Pentium  III ho scelto il kernel ottimizzato per processori i686.<br />
Per avere  una lista dei kernel disponibili (naturalmente mi aspetto che I  repository siano configurati) occorre digitare da terminale</p>
<div>
$apt-cache search –names-only linux-image</div>
<p>per  verificare il kernel utilizzato</p>
<div>
$uname  -r</div>
<p>La scelta del kernel dedicato alla nostra  architettura è un&#8217;operazione che ci consentirà anche durante il nostro  lavoro di ottenere prestazioni migliori in quanto il kernel dovrebbe  utilizzare le istruzioni macchina specifiche per la nostra CPU.</p>
<div>Punto 3.2 &#8211; I giusti parametri di Boot</div>
<p>Nel  tempo che va tra il caricamento da parte di GRUB e l&#8217;avvio di init, il  kernel compie delle azioni di default quali riconoscimento hardware ed  altro. Configurando propriamente il boot loader facendo in modo che  quest&#8217;ultimo passi degli utili parametri d&#8217;avvio al kernel, possiamo  cercare di bypassare le azioni che risultano inutili per l&#8217;utilizzo che  facciamo del nostro PC.<br />
La lista dei parametri che è possibile  passare al kernel linux è smisurata a tal proposito mi limito ad  elencare e spiegare quelli che io ho ritenuto utili e vi rimando alla  lettura di questa guida.<br />
Torniamo ad editare il file  /boot/grub/menu.lst e modifichiamo le seguenti righe SENZA ELIMINARE IL  CANCELLETTO:</p>
<div>
<strong><br />
# kopt=  root=/dev/hda2 rootfstype=ext3 mem=512m ro<br />
# defoptions= quiet  noresume vga=788<br />
</strong></div>
<p>a questo punto:</p>
<div>
$update-grub</div>
<p>Naturalmente questi  sono I valori relativi alla macchina in questione quindi non vanno presi  come paramentri generali.</p>
<div>
-  root=/dev/hda2: indica qual&#8217;è il disco che contiene la partizione di  root (“/”); questo parametro non comporta miglioramenti in fase di boot  ma è indispensabile al kernel per avviare il sistema.<br />
-  rootfstype=ext3: indica con quale filesystem è stata formattata la  partizione di root; ho pensato che specificandolo apertamente il kernel  avrebbe evitato di tentare di capirlo da solo.<br />
- mem=512m: specifica  la quantità di memoria disponibile; come sopra ho pensato che il kernel  evitasse di calcolare la memoria RAM disponibile.<br />
- ro: specifica di  montare inizialmente la partizione di root in sola lettura, inutile per  le prestazioni in fase di boot ma utile per eseguire il controllo del  disco.<br />
- quiet= specifica al kernel di non riportare a video l&#8217;output  di tutte le sue operazioni in fase di boot ma di visualizzare  semplicemente il messaggio “Loading kernel&#8230;”; ho pensato che, anche se  in minima parte, potesse essere utile diminuire le operazioni per la  stampa sullo standard output.<br />
- noresume: se non si utilizza la  sospensione su disco, tramite “noresume” evitiamo che il kernel analizzi  la partizione di swap per ricercare eventuali sessioni ibernate.<br />
-  vga=788: imposta Il framebuffere della scheda video; inutile ai fini  della riduzione del tempo di boot.</div>
<div>Punto 4 – Riduzione della procedura di avvio dei  demoni</div>
<p>Prima di iniziare ad addentrarci in questa sezione,  consiglierei di studiare a fondo il funzionamento di sysv-init al fine  di comprendere le azioni che compieremo e la procedura di boot in  generale.<br />
Consiglio inoltre di installare bootchart, uno strumento  che ci permetterà di avere informazioni più dettagliate e soprattutto di  monitorare I miglioramenti di quest&#8217;ultima fase della procedura di  boot.</p>
<div>
$apt-get install bootchart  bootchart-view</div>
<p>Poi modificare il file  /boot/grub/menu.lst ed aggiungere la seguente il seguente comando <strong>init=/sbin/bootchartd”</strong> ai parametri di boot del nostro kernel.<br />
Bootchart verrà avviato come  primo processo dal kernel e si occuperà poi di avviare init e di  monitorare il suo comportamento.<br />
A questo punto riavviare il sistema e  poi digitare</p>
<div>
$bootchart -f png</div>
<p>Questo  comando ci permetterà di ottendere un immagine png che conterra il  grafico rappresentante la nostra procedura di boot:</p>
<div>
<img src="http://dmp.altervista.org/img/GUIDE/PRIMA.png" alt="" /></div>
<p>La  figura rappresenta I demoni avviati ed il tempo occorso per ciascun  avvio; in alto possiamo leggere il tempo totale impiegato: 57secondi.</p>
<div>Punto 4.1 – Disabilitazione demoni inutilizzati</div>
<p>Installiamo  il pacchetto sysv-rc-conf ed avviamo sysv-rc-conf come root; questa  utility ci permette di gestire I demoni avviati da init durante la fase  di boot del sistema. Ogni demone rappresenta un servizio che il nosto  computer ci fornirà; analiziamo quelli del calcolatore in questione.</p>
<div>
<img src="http://dmp.altervista.org/img/GUIDE/servizi.png" alt="" /></div>
<p>Eliminando  le “X” possiamo disabilitare I servizi che non utiliziamo;  personalmente io ho eliminato</p>
<div>
-  avahi-daemon: http://avahi.org/<br />
- exim4: è un MTA, utilizzato anche  in locale per inviare all&#8217;utente root eventi amministrativi, ma a me non  serve<br />
- lpd: dovrebbe essere un demone per la gestione della stampa  ma penso che utilizzando cups se ne possa fare a meno<br />
- nfs-common:  non utilizzando alcun net-filesystem lo elimino<br />
- policycoreutils:  dovrebbe gestire le politiche di sicurezza selinux ma penso che per uso  domestico se ne possa fare a meno, o per lo meno io l&#8217;ho disabilitato e  non ho avuto problemi<br />
- ssh: nel caso in cui sia attivo il demone ssh  e non vi occurre rendere accessibile il pc da remoto disabilitatelo</div>
<div>
Per gli altri demoni vi rimando a Google ed a man.</div>
<div></div>
<div>Punto 4.2 – Disabilitazione terminali inutilizzati</div>
<p>Solitamente  in un sistema GNU/Linux è possibile usufruire di più console  accessibili tramite la combinazione di tasti CTRL + ALT + Fx.<br />
Di base  Debian ne attiva 6 testuali ed una dove eseguirà il server grafico ma  difficilmente un utente desktop avrà bisogno di 6 console grafiche. A  tal proposito può essere utile lasciare abilitate esclusivamente la  console con il server grafico ed un unica console testuale utile per  eventuali assistenze tecniche.<br />
Editiamo il file /etc/inittab e  commentiamo le seguenti righe:</p>
<div><strong><br />
1:2345:respawn:/sbin/getty 38400 tty1<br />
#2:23:respawn:/sbin/getty  38400 tty2<br />
#3:23:respawn:/sbin/getty 38400 tty3<br />
#4:23:respawn:/sbin/getty 38400 tty4<br />
#5:23:respawn:/sbin/getty 38400  tty5<br />
#6:23:respawn:/sbin/getty 38400 tty6<br />
</strong></div>
<div>Punto 4.3 – Parallelizzare l&#8217;avvio dei servizi</div>
<p>Sysvinit  avvia un demone solo quando quello precedente segnala che il suo  startup è avvenuto con successo. Modificando opportunamente I file di  configurazione possiamo istruire init affinche avvii I demoni  direttamente senza aspettare risposta dal demone precedente.</p>
<div>
$echo “CONCURRENCY=shell” &gt;&gt;  /etc/default/rcS</div>
<div>Punto 4.4 –  Sostituire BASH con DASH</div>
<p>Alcuni demoni durante la fase di  avvio necessitano di essere eseguiti in una shell; di default la shell  utilizzata sia per l&#8217;avvio che per gli utenti è BASH (Bourne Again  SHell), la più diffusa e completa del mondo Linux. Utilizzare uno  strumento tanto potente solo per fornire un ambiente di esecuzione ai  demoni risulta però controproducente; può essere quindi più indicato  installare e settare come shell di default DASH, uno strumento più  modesto ma che fa comunque il suo lavoro.</p>
<div>
$apt-get  install dash<br />
$dpkg-reconfigure dash</div>
<p>A questo punto  il link /bin/sh punterà a /bin/dash di conseguenza quest&#8217;ultima verrà  usata in fase d&#8217;avvio. Questa operazione non dovrebbe comunque intaccare  le potenzialità della shell usata dall&#8217;utente in quanto quest&#8217;ultima è  indicata nel file /etc/passwd<br />
[pagebreak]</p>
<div>Punto 4.5 – Settare in modo ottimale I demoni di rete</div>
<p>All&#8217;avvio  il sistema controlla il file /etc/network/interfaces per sapere come  gestire le interfacce di rete, se non settato corretamente il sistema  all&#8217;avvio potrebbe cercare di richiedere I parametri di rete per  un&#8217;ipotetica interfaccia ethernet scollegata. A tal proposito il mio  consiglio è quello di istruire il sistema affinche all&#8217;avvio configuri  automaticamente solo l&#8217;interfaccia di loopback.<br />
Editare il file  /etc/network/interfaces nel seguente modo:</p>
<div><strong><br />
# This file describes the network interfaces  available on your system<br />
# and how to activate them. For more  information, see interfaces(5).</p>
<p># The loopback network interface<br />
auto  lo<br />
iface lo inet loopback<br />
#Wired Interface<br />
#<br />
#DHCP(default)<br />
iface  eth0 inet dhcp<br />
</strong></div>
<div>Punto 4.6 –  Ordinare l&#8217;avvio dei demoni</div>
<p>Analizzando gli script dei  demoni presenti in /etc/init.d ci accorgiamo che sulla testa di ognuno  di essi sono specificate, attraverso alcuni commenti, le dipendenze di  ogni demone rispetto ad altri. Tali commenti non sono interpretati da  init che avvia I demoni basandosi sui numeri interi specificati nel nome  dello script (vd. /etc/rc2.d/).<br />
Accade quindi che init avvia un  demone che spreca cicli CPU attendendo l&#8217;avvio del demone dal quale  dipende.<br />
Esistono sistemi alternativi a sysv-init che si basano sulle  dipendenze dei demoni (initNG) o sugli eventi da essi generati (Upstart  di Ubuntu) ma il nostro intento è quello di configurare in modo  ottimale sysv-init che è lo standard de facto.<br />
Sarebbe quindi utile  analizzare le dipendenze dei demoni e cambiare I numeri interi in modo  da ordinare la fase di boot; fortunatamente l&#8217;utility InsServ lo fa al  posto nostro:</p>
<div>
$apt-get install  insserv<br />
$dpkg-reconfigure insserv</div>
<p>Eccoci  alla fine.<br />
Riavviamo il PC e rianalizziamo l&#8217;output di bootchart -f  png</p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2010/03/speedup-debian-boot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metodo dei Tableaux Analitici in Prolog</title>
		<link>http://www.fireteam.it/2010/03/metodo-dei-tableaux-analitici-in-prolog/</link>
		<comments>http://www.fireteam.it/2010/03/metodo-dei-tableaux-analitici-in-prolog/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 22:45:54 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[prolog]]></category>
		<category><![CDATA[tableaux]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=748</guid>
		<description><![CDATA[


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Implementazione, nel linguaggio prolog, del metodo dei Tableaux Analitici studiato nel corso di Logica.
Nel sistema sono stati definiti i seguenti operatori:
:- op(650, xfy, sse).
:- op(640, xfy, implies).
:- op(630, yfx, or).
:- op(620, yfx, and).
:- op(610, fy, not).
Il primo parametro del predicato [...]]]></description>
			<content:encoded><![CDATA[<p><!--[if !mso]><br />
<mce :style>< !<br />
v\:* {behavior:url(#default#VML);}<br />
o\:* {behavior:url(#default#VML);}<br />
w\:* {behavior:url(#default#VML);}<br />
.shape {behavior:url(#default#VML);}<br />
--></p>
<p><!--[endif]--></p>
<p class="Section1">
<p class="MsoNormal" style="text-align:right" align="right"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="mso-ansi-language:EN-US" lang="EN-US"> </span></p>
<p><span style="font-size:36.0pt;mso-bidi-font-size:28.0pt"> </span></p>
<p class="Section1">
<p class="MsoNormal" style="text-align:justify">Implementazione, nel linguaggio prolog, del metodo dei Tableaux Analitici studiato nel corso di Logica.</p>
<p class="MsoNormal" style="text-align:justify">Nel sistema sono stati definiti i seguenti operatori:</p>
<pre class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:10.0pt; mso-bidi-font-size:11.0pt;font-family:">:- op(650, xfy, sse).
:- op(640, xfy, implies).
:- op(630, yfx, or).
:- op(620, yfx, and).
:- op(610, fy, not).</span></pre>
<p class="MsoNormal" style="text-align:justify">Il primo parametro del predicato <em style="mso-bidi-font-style:normal">op/3</em> rappresenta la priorità dell’operatore definito; nel nostro caso l’operatore con maggior priorità è il not, seguito in ordine da and, or, implies, sse.<br />
Questi operatori rappresentano i connettivi logici come rappresentato in tabella:
</p>
<p class="MsoNormal" style="text-align:justify"><span id="more-748"></span></p>
<div>
<table class="MsoNormalTable" style="border: medium none; width: 7cm; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="265">
<tbody>
<tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes">
<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center"><strong style="mso-bidi-font-weight:normal">Connettivo</strong></p>
</td>
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center"><strong style="mso-bidi-font-weight:normal">Operatore</strong></p>
</td>
</tr>
<tr style="mso-yfti-irow:1">
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center"><span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol">~<br />
</span></span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center">not</p>
</td>
</tr>
<tr style="mso-yfti-irow:2">
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center"><span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol">^<br />
</span></span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center">and</p>
</td>
</tr>
<tr style="mso-yfti-irow:3">
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center"><span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol">?<br />
</span></span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center">or</p>
</td>
</tr>
<tr style="mso-yfti-irow:4">
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center"><span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol">-&gt;<br />
</span></span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center">implies</p>
</td>
</tr>
<tr style="mso-yfti-irow:5;mso-yfti-lastrow:yes">
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center"><span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol">&lt;-&gt;<br />
</span></span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 244.3pt;" width="326" valign="top">
<p class="MsoNormal" style="text-align:center" align="center">sse</p>
</td>
</tr>
</tbody>
</table>
</div>
<p class="MsoNormal" style="text-align:center" align="center">
<p class="MsoNormal" style="text-align:justify">Per i quantificatori utilizziamo invece due predicati (<span style="font-size:10.0pt;mso-bidi-font-size:11.0pt; font-family:">forall(x,fbf)</span> e <span style="font-size:10.0pt;mso-bidi-font-size: 11.0pt;font-family:">exists(x,fbf)</span>), entrambi hanno bisogno di due parametri: il primo è la variabile da quantificare ed il secondo è la formula ben formata quantificata. I simboli di variabile presenti nelle formule<br />
ben formate passate in input sono in minuscolo in modo da distinguerli dalle variabili Prolog. Il sistema presentato elabora fbf (formule ben formate) della logica del primo ordine chiuse e pure.<br />
Prima di iniziare a sviluppare il tableau per la formula data in input, è interrogato il predicato <em style="mso-bidi-font-style:normal">fbf_chiusa/1</em>:
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
X and Y ) :- !, fbf_chiusa(X),fbf_chiusa(Y).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
X or Y ) :- !, fbf_chiusa(X), fbf_chiusa(Y).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
X implies Y ) :- !, fbf_chiusa(X), fbf_chiusa(Y).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
X sse Y ) :- !, fbf_chiusa(X), fbf_chiusa(Y).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
forall(X,Y) ) :- atomic(X),instantiate(Y,X,-1,Y1),!, fbf_chiusa(Y1).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
exists(X,Y) ) :- atomic(X), instantiate(Y,X,-1,Y1),!,fbf_chiusa(Y1).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
not X ) :- ! ,fbf_chiusa(X).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">fbf_chiusa(<br />
X ) :- atomo_ground(X).</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">%instantiate(Y,X,N,Y1)<br />
:- Y1 è la formula Y dove ogni occorrenza di X è sostituita con N</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">%atomo_ground(X)<br />
:- X è un atomo ground.</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Questo predicato è vero se il suo argomento è una formula ben formata chiusa. In particolare il controllo <em style="mso-bidi-font-style:normal">atomo_ground(X)</em> è fatto verificando che X sia un atomo, e che tutti i suoi termini siano degli interi (istanziamo le variabili sul dominio dei numeri interi).</p>
<p class="MsoNormal" style="text-align:justify">
<h1>Descrizione implementazione</h1>
<p class="MsoNormal">Cominciamo la descrizione dell’implementazione presentando i predicati ausiliari. Innanzitutto abbiamo i predicati che ci permettono di identificare il tipo di formula:</p>
<p class="MsoNormal">
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_alpha(_<br />
and _).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_alpha(_<br />
sse _).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_alpha(not<br />
(_ or _)).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_alpha(not<br />
(_ implies _)).</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_beta(_ or<br />
_).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_beta(_<br />
implies _).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_beta(not<br />
(_ and _)).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_beta(not<br />
(_ sse _)).</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_delta(exists(<br />
_ , _ )).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_delta(not<br />
forall( _ , _ )).</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_fresh_gamma(forall(<br />
X , Y ), forall( X , Y , 0)).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_fresh_gamma(not<br />
exists( X , Y ), not exists( X , Y , 0)).</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_gamma(forall(<br />
_ , _ , _ )).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">is_gamma(not<br />
exists( _ , _ , _ )).</span>
</p>
<p class="MsoNormal">
<p class="MsoNormal">Altri predicati sono <em style="mso-bidi-font-style:normal">atomo/1</em> e <em style="mso-bidi-font-style:normal">atomo_ground/1</em> :</p>
<p class="MsoNormal">
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">atomo_ground(X)<br />
:- compound( X ), X =.. [_|Terms], lista_interi(Terms).</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">lista_interi([]).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">lista_interi([Termine<br />
| Terms]) :- integer(Termine), lista_interi(Terms).</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">atomo(X) :-<br />
compound( X ), X =.. Parametri, parametri_validi(Parametri).</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">parametri_validi([]).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">parametri_validi([Parametro<br />
| Tail]) :- atomic(Parametro),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>Parametro \== not,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>Parametro \== and,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>Parametro \== or,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>Parametro \== implies,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>Parametro \== sse,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>Parametro \== forall,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>Parametro<br />
\== exists,</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>parametri_validi(Tail).</span>
</p>
<p class="MsoNormal">
<p class="MsoNormal">Questi predicati sono utilizzati da <em style="mso-bidi-font-style: normal">fbf_chiusa/1</em> (già presentata nel precedente paragrafo) e da <em style="mso-bidi-font-style:normal">istantiate/4</em> riportato di seguito:</p>
<p class="MsoNormal">
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
X and Y , Var , Par , X1 and Y1) :- !,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(X,Var,Par,X1),</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1).</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
X or Y , Var , Par , X1 or Y1) :- !,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(X,Var,Par,X1),</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1).</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
X implies Y , Var , Par , X1 implies Y1) :- !,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(X,Var,Par,X1),</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1).</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
X sse Y , Var , Par , X1 sse Y1) :- !,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(X,Var,Par,X1),</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1).</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
forall(X,Y),Var,Par,forall(X,Y1)) :- X \== Var,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>!,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1).</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
forall(X,Y),Var,_,forall(X,Y)) :- X == Var, !. </span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
exists(X,Y),Var,Par,exists(X,Y1)) :- X \== Var,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>!,</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>instantiate(Y,Var,Par,Y1).</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
exists(X,Y),Var,_,exists(X,Y)) :- X == Var,!.</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
not X,Var,Par, not X1 ) :-!, instantiate(X,Var,Par,X1).</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">instantiate(<br />
X,Var,Par,X1 ) :- atomo(X), !, substitute_occurrences(X,Var,Par,X1).</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">substitute_occurrences(X,Var,Par,X1):-<br />
X =.. [Pred|Terms], substitute(Terms,Var,Par,Terms1),X1=.. [Pred|Terms1].</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">substitute([],_,_,[]).</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">substitute([Term<br />
| Tail],Var,Par,[Term1 | Tail1]) :- Term == Var,Term1 = Par,!,<br />
substitute(Tail,Var,Par,Tail1).</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">substitute([Term<br />
| Tail],Var,Par,[Term1 | Tail1]) :- Term \== Var,Term1 = Term,!,<br />
substitute(Tail,Var,Par,Tail1).</span>
</p>
<p class="MsoNormal">
<p class="MsoNormal" style="text-align:justify">Il predicato istantiate(X, V, P,<br />
X1) è vero quando X1 è la formula ottenuta sostituendo nella formula X tutte le<br />
occorrenze della variabile V con il parametro P.
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Passiamo ora allo sviluppo dell’albero di fbf costituente il tableau.</p>
<p class="MsoNormal" style="text-align:justify">Il cuore del calcolo è nel predicato <em style="mso-bidi-font-style:normal">tclose(Fbf, Limite)</em> che è vero se il tableau sviluppato per la formula Fbf chiude istanziando massimo “<em style="mso-bidi-font-style:normal">Limite</em>” parametri. <em style="mso-bidi-font-style: normal">Fbf</em><span style="mso-spacerun:yes"> </span>deve essere una formula ben formata chiusa:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">tclose(Fbf,Limite)<br />
:- fbf_chiusa(Fbf), closed_branch([Fbf],[],[],[],[],[],Limite,0,[]).</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Ogni ramo del tableau è descritto dai termini di closed_branch/9:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch(Fbfs,As,Ds,Bs,Gs,Ls,Limite,Params,Elaborate)</span></p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">in particolare:</p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Fbfs: lista delle formule in attesa di essere<br />
inserite in uno stack sul ramo</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">As: stack delle formule di tipo alfa sul ramo</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Ds: stack delle formule di tipo delta sul ramo</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Bs: stack delle formule di tipo beta sul ramo</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Gs: stack delle formule di tipo gamma sul ramo</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Ls: stack di letterali sul ramo</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Limite: massimo numero di parametri da utilizzare</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Params: parametri introdotti (rappresentati dagli<br />
interi da 1 a Params)</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l0 level1 lfo3;      tab-stops:list 36.0pt">Elaborate: lista delle formule già elaborate (utile<br />
per stampare il ramo)</li>
</ul>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Il tableau è sviluppato elaborando le formule in base alla priorità: prima le formule alfa, poi le delta,<span style="mso-spacerun:yes"> </span>le beta, ed infine le gamma. Per memorizzare le formule del ramo ancora da elaborare sono utilizzati quattro stack (As, Ds, Bs,Gs).</p>
<h3>Elaborazione formule alfa</h3>
<p class="MsoNormal" style="text-align:justify">La formula da elaborare è presa in testa allo stack<span style="mso-spacerun:yes"> </span>“As”<span style="mso-spacerun:yes"> </span>delle formule alfa. Successivamente vengono introdotte due nuove formule Alpha1 ed Alpha2<span style="mso-spacerun:yes"> </span>tali che il predicato <span style="font-size:11.0pt;mso-bidi-font-size: 12.0pt;font-family:">regola_alpha(Formula,Alpha1,Alpha2)</span> risulta vero. Tali formule sono poi inserite nello stack delle formule da elaborare. Di seguito è riportato il codice necessario:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">%alpha</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([Formula|As],Ds,Bs,Gs,Ls,Limite,Params,Elaborate)<br />
:- </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>regola_alpha(Formula,Alpha1,Alpha2),</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>!,</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([Alpha1,Alpha2],As,Ds,Bs,Gs,Ls,Limite,Params,[Formula|Elaborate]).</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_alpha(<br />
A and B, A, B ).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_alpha(<br />
not ( A implies B ), A, not B ).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_alpha(<br />
not ( A or B ), not A, not B ).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_alpha(<br />
A sse B, A implies B, B implies A).</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">La formula elaborata viene inserita nella lista <span style="font-size:11.0pt;mso-bidi-font-size:12.0pt; font-family:">Elaborate</span>.</p>
<p class="MsoNormal" style="text-align:justify">
<h3>Elaborazione formule delta</h3>
<p class="MsoNormal">
<p class="MsoNormal" style="text-align:justify">La formula da elaborare è presa in testa allo stack <span style="font-size:11.0pt;mso-bidi-font-size:12.0pt; font-family:">“Ds”</span>delle formule delta ed a partire da essa viene introdotta una nuova formula Delta1 che soddisfa il<span style="mso-spacerun:yes"> </span>predicato<span style="mso-spacerun:yes"> </span><span style="font-size:11.0pt;mso-bidi-font-size: 12.0pt;font-family:">regola_delta(Formula,Delta1,Limite,Params)</span>. Questa formula è poi inserita nello stack delle formule da elaborare. Di seguito è riportato il codice necessario:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">%delta<br />
</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([],[Formula|Ds],Bs,Gs,Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>Params &lt; Limite, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_delta(Formula,Delta1,Limite,Params), </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Params1 is Params + 1, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([Delta1],[],Ds,Bs,Gs,Ls,<br />
Limite,Params1,[Formula|Elaborate]). </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">%delta<br />
</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([],[Formula|Ds],Bs,Gs,Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Params &gt;= Limite, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([],[],Ds,Bs,Gs,Ls, Limite,Params,[Formula|Elaborate]). </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_delta(exists(X,Fbf),Fbf1,_,N):-<br />
N1 is N+1, instantiate( Fbf , X , N1 , Fbf1).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_delta(not<br />
forall(X,Fbf),not Fbf1,_,N):- N1 is N+1, instantiate( Fbf , X , N1 , Fbf1).</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">La formula elaborata viene inserita nella lista <span style="font-size:11.0pt;mso-bidi-font-size:12.0pt; font-family:">Elaborate</span>.</p>
<p class="MsoNormal" style="text-align:justify">
<h3>Elaborazione formule beta</h3>
<p class="MsoNormal">
<p class="MsoNormal" style="text-align:justify">La formula da elaborare è presa in testa allo stack “Bs” delle formule beta e sono introdotte due nuove formule Beta1 e Beta2 che soddisfano il predicato <span style="font-size:11.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_beta(Formula,Beta1,Beta2). </span>Queste formule prodotte sono inserite nello stack delle formule da elaborare, ma in questo caso vi sono due chiamate ricorsive al predicato poichè una formula di tipo beta prevede una biforcazione del ramo.</p>
<p class="MsoNormal" style="text-align:justify">Di seguito è riportato il codice necessario:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">%beta<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([],[],[Formula|Bs],Gs,Ls,Limite,Params,Elaborate)<br />
:- </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_beta(Formula,Beta1,Beta2),</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!,</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([Beta1],[],[],Bs,Gs,Ls,<br />
Limite,Params,[Formula|Elaborate]),</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>closed_branch([Beta2],[],[],Bs,Gs,Ls,<br />
Limite,Params,[Formula|Elaborate]).</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_beta(<br />
A or B, A, B ).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_beta(<br />
A implies B, not A, B ).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_beta(<br />
not ( A and B ), not A, not B ).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_beta(<br />
not ( A sse B ), not ( A implies B ), not ( B implies A ) ).</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">La formula elaborata viene inserita nella lista <span style="font-size:11.0pt;mso-bidi-font-size:12.0pt; font-family:">Elaborate</span>.</p>
<p class="MsoNormal" style="text-align:justify">
<h3>Elaborazione formule gamma</h3>
<p class="MsoNormal" style="text-align:justify">Le formule di tipo gamma sono date in input nella forma:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:center" align="center"><span style="font-size:11.0pt;mso-bidi-font-size:12.0pt;font-family:">forall(x,fbf)</span><span style="mso-spacerun:yes"> </span>oppure<span style="mso-spacerun:yes"><br />
</span><span style="font-size:11.0pt;mso-bidi-font-size:12.0pt;font-family: ">not exists(x,fbf)</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Per semplificare la gestione di queste formule sono introdotte nuove formule ad esse equivalenti attraverso il predicato <span style="font-size:11.0pt;mso-bidi-font-size:12.0pt;font-family: ">is_fresh_gamma/2</span>:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">is_fresh_gamma(forall(<br />
X , Y ), forall( X , Y , 0)).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">is_fresh_gamma(not<br />
exists( X , Y ), not exists( X , Y , 0)).</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Queste nuove formule hanno la forma:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:center" align="center"><span style="font-size:11.0pt;mso-bidi-font-size:12.0pt;font-family:">forall(x,fbf,n)</span><span style="mso-spacerun:yes"> </span>oppure<span style="mso-spacerun:yes"><br />
</span><span style="font-size:11.0pt;mso-bidi-font-size:12.0pt;font-family: ">not exists(x,fbf,n)</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">dove <span style="font-family: ">n</span> è un intero che porta traccia dei parametri per i quali già è stata istanziata la formula fbf. Ogni volta si istanzia la formula, cambiamo il valore di <span style="font-family:">n</span> in questo modo:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">incrementa(forall(X,<br />
Fbf, _), forall(X, Fbf, Params), Params).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">incrementa(not<br />
exists(X, Fbf, _), not exists(X, Fbf, Params), Params).</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">La formula gamma da elaborare è presa in testa allo stack <span style="font-size:11.0pt;mso-bidi-font-size: 12.0pt;font-family:">“Gs”</span>delle formule gamma. A partire da questa formula vengono introdotte una<span style="mso-spacerun:yes"> </span>lista Gammas di nuove formule. Tali formule, introdotte attraverso il predicato <span style="font-size:11.0pt;mso-bidi-font-size:12.0pt; font-family:">regola_gamma(Formula,Gammas,Limite,Params,Params1), </span>rappresentano<span style="mso-spacerun:yes"> </span>tutte le instanziazioni della formula quantificata con i parametri<span style="mso-spacerun:yes"> </span>da <span style="font-family:">n</span> fino a <span style="font-family: ">Params1</span>.<span style="font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify">Queste formule prodotte sono inserite nello stack delle formule da elaborare.</p>
<p class="MsoNormal" style="text-align:justify">Di seguito è riportato il codice necessario:</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">%gamma<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([],[],[],[Formula|Gs],Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>is_gamma(Formula), </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Params &lt; Limite, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>regola_gamma(Formula,Gammas,Limite,Params,Params1),<br />
</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>incrementa(Formula, Formula1,<br />
Params1), </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>append(Gs, [Formula1], Gs2), </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>closed_branch(Gammas,<br />
[],[],[],Gs2,Ls, Limite,Params1,[Formula|Elaborate]).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>%gamma<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([],[],[],[Formula|Gs],Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>is_gamma(Formula), </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Params &gt;= Limite, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_gamma(Formula,Gammas,Limite,Params,Params1),</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>closed_branch(Gammas,<br />
[],[],[],Gs,Ls, Limite,Params1,[Formula|Elaborate]).</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_gamma(forall(X,<br />
Fbf, N), Gammas, Limite, Params, Params1) :- </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_gamma(Gammas, X, Fbf, N, N, Limite, Params, Params1). </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_gamma(not<br />
exists(X, Fbf, N), Gammas, Limite, Params, Params1) :- </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_gamma(Gammas, X, not Fbf, N, N, Limite, Params, Params1). </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">%<br />
la regola gamma introduce parametri nuovi</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_gamma([],<br />
_, _, N, _, Limite, Params, _) :- N == Params, N<span style="mso-spacerun:yes"> </span>&gt;= Limite,!.</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_gamma([Fbf1],<br />
X, Fbf, N, _, Limite, Params, Params1) :- N == Params,</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Params &lt;<br />
Limite,</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Params1 is Params<br />
+ 1, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>instantiate( Fbf<br />
, X , Params1 , Fbf1).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">%<br />
la regola gamma non introduce parametri nuovi<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_gamma([Fbf1<br />
| Gammas], X, Fbf, N, Next, _, Params, Params1) :- N &lt; Params, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Next &lt; Params,<br />
</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>Next1 is Next+1, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>instantiate( Fbf<br />
, X , Next1 , Fbf1), </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>regola_gamma(Gammas,<br />
X, Fbf, N, Next1, _, Params, Params1).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">regola_gamma([],<br />
_, _, N, Next, _, Params, Params) :- N &lt; Params , Next == Params.</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Notiamo che se la formula è stata già istanziata sul ramo su tutti i parametri permessi dal limite, essa non sarà ulteriormente istanziata.</p>
<h3>Inserimento delle formule negli stack</h3>
<p class="MsoNormal" style="text-align:justify">Quando il predicato closed_branch ha arietà 9, allora il primo termine è la lista delle fbf in attesa di essere inserite nello stack adatto (<em style="mso-bidi-font-style:normal">push/11</em>).</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([Fbf|_],As,Ds,Bs,Gs,Ls,_,_,Elaborate)<br />
:-</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>chiude(Fbf,As,Ds,Bs,Gs,Ls),</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!,</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>stampa_ramo([Fbf],As,Ds,Bs,Gs,Ls,Elaborate,&#8217;CHIUSO&#8217;).</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([Fbf|Fbfs],As,Ds,Bs,Gs,Ls,Limite,Params,Elaborate):-<br />
</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>\+ chiude(Fbf,As,Ds,Bs,Gs,Ls),</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>push_formula(Fbf,As,Ds,Bs,Gs,Ls,As1,Ds1,Bs1,Gs1,Ls1),</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!,</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch(Fbfs,As1,Ds1,Bs1,Gs1,Ls1,Limite,Params,Elaborate).</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(not<br />
not Fbf,As,Ds,Bs,Gs,Ls,As1,Ds1,Bs1,Gs1,Ls1) :-</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>!,</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>push_formula(Fbf,As,Ds,Bs,Gs,Ls,As1,Ds1,Bs1,Gs1,Ls1).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,[Fbf<br />
| As],Ds,Bs,Gs,Ls) :- is_alpha(Fbf), !. </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,[Fbf<br />
| Ds],Bs,Gs,Ls) :- is_delta(Fbf), !. </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,[Fbf<br />
| Bs],Gs,Ls) :- is_beta(Fbf), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,[Fbf1<br />
| Gs],Ls) :- is_fresh_gamma(Fbf, Fbf1), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,[Fbf<br />
| Gs],Ls) :- is_gamma(Fbf), !. </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,Gs,[Fbf<br />
| Ls]) :- atomo(Fbf), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">push_formula(not<br />
Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,Gs,[not Fbf | Ls]) :- atomo(Fbf), !. </span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">In questo punto è fatto il controllo di chiusura del ramo: un ramo è chiuso se contiene una coppia di fbf<span style="mso-spacerun:yes"> </span>complementari(<em style="mso-bidi-font-style: normal">chiude/6</em>). Resta invece aperto quando non ci sono più formule da sviluppare.</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">closed_branch([],[],[],[],[],Ls,_,_,Elaborate)<br />
:- !,</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>stampa_ramo([],[],[],[],[],Ls,Elaborate,&#8217;APERTO&#8217;).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">closed_branch([Fbf|_],As,Ds,Bs,Gs,Ls,_,_,Elaborate)<br />
:- chiude(Fbf,As,Ds,Bs,Gs,Ls), </span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"><span style="mso-spacerun:yes"><br />
</span>stampa_ramo([Fbf],As,Ds,Bs,Gs,Ls,Elaborate,&#8217;CHIUSO&#8217;).</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(not<br />
Fbf,_,_,Bs,_,_) :- is_alpha(Fbf), member(Fbf, Bs), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(not<br />
Fbf,_,_,_,Gs,_) :- is_delta(Fbf), member(Fbf, Gs), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(not<br />
Fbf,As,_,_,_,_) :- is_beta(Fbf), member(Fbf, As), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(not<br />
Fbf,_,Ds,_,_,_) :- is_gamma(Fbf), member(Fbf, Ds), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(not<br />
Fbf,_,_,_,_,Ls) :- atomo_ground(Fbf), member(Fbf, Ls), !.</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(Fbf,_,_,Bs,_,_)<br />
:- is_alpha(Fbf), member(not Fbf, Bs), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(Fbf,_,_,_,Gs,_)<br />
:- is_delta(Fbf), member(not Fbf, Gs), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(Fbf,As,_,_,_,_)<br />
:- is_beta(Fbf), member(not Fbf, As), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(Fbf,_,Ds,_,_,_)<br />
:- is_gamma(Fbf), member(not Fbf, Ds), !.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:">chiude(Fbf,_,_,_,_,Ls)<br />
:- atomo_ground(Fbf), member(not Fbf, Ls), !.</span>
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Quando è terminata l’elaborazione di un ramo lo si stampa a video con <em style="mso-bidi-font-style:normal">stampa_ramo/8</em>.</p>
<p class="MsoNormal">
<h1>Output</h1>
<p class="MsoNormal" style="text-align:justify">Per ogni ramo del tableau sviluppato, è stampata a video la lista delle formule contenute in quel ramo. Il predicato è <em style="mso-bidi-font-style:normal">stampa_ramo/8</em>:</p>
<ul style="margin-top:0cm" type="disc">
<li class="MsoNormal" style="text-align:justify;mso-list:l2 level1 lfo4;      tab-stops:list 36.0pt">il primo termine Fbf contiene la lista contenente<br />
la fbf con la quale viene chiuso quel ramo (se il ramo è aperto questo<br />
parametro è una lista vuota)</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l2 level1 lfo4;      tab-stops:list 36.0pt">l’ultimo termine Tipo è una stringa che può essere:
<ul style="margin-top:0cm" type="circle">
<li class="MsoNormal" style="text-align:justify;mso-list:l2 level2 lfo4;       tab-stops:list 72.0pt">APERTO: se il ramo è aperto</li>
<li class="MsoNormal" style="text-align:justify;mso-list:l2 level2 lfo4;       tab-stops:list 72.0pt">CHIUSO: se il ramo è chiuso</li>
</ul>
</li>
</ul>
<p class="MsoNormal">
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">stampa_ramo(Fbf,As,Ds,Bs,Gs,Ls,Elaborate,Tipo)<br />
:-</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>write(&#8217;===========[RAMO '),<br />
write(Tipo), write(']===========&#8217;), nl,</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Elaborate),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(As),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Ds),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Bs),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>stampa_formule(Gs),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Ls),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_ultima_formula(Fbf),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>nl,</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>write(&#8217;===================================&#8217;), nl, nl.</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">stampa_formule(<br />
[] ).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">stampa_formule(<br />
[Formula | Formulas] ) :-</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>stampa_formule(Formulas),</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"><span style="mso-spacerun:yes"> </span>write(Formula),<br />
nl.</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">stampa_ultima_formula([]).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">stampa_ultima_formula([Fbf])<br />
:- write(Fbf), write(&#8217; XXX&#8217;).</span>
</p>
<p class="MsoNormal">
<p class="MsoNormal" style="text-align:justify">Esempi di output a video sono riportati negli esempi d’uso.</p>
<h1>Esempi d’uso</h1>
<p class="MsoNormal">In questa sezione sono riportati degli esempi d’uso: il primo con una formula valida (tableau con un unico ramo), il secondo con una formula soddisfacibile ma non valida e infine un esempio con una formula valida<br />
con un tableau con più rami.
</p>
<p class="MsoNormal">Tutte le prove sono state fatte con un limite sul numero di parametri introducibili pari a 10, quindi quando si parlerà di soddisfacibilità  in relazione alla presenza di rami aperti del tableau si intenderà sempre relativamente a un dominio con cardinalità uguale al numero di parametri introducibili.</p>
<p class="MsoNormal">
<h2>Esempio formula valida</h2>
<p>Per prima cosa bisogna caricare il codice nell’interprete prolog (swi-prolog), e poi chiedere all’interprete:</p>
<p class="MsoNormal">
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">?- prova(not<br />
exists(y,forall(x,(f(y) implies f(x))))).</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">===========[RAMO<br />
CHIUSO]===========</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
forall(x, f(y)implies f(x)), 0)</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not forall(x,<br />
f(1)implies f(x))</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not<br />
(f(1)implies f(2))</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
forall(x, f(y)implies f(x)), 1)</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not forall(x,<br />
f(2)implies f(x))</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not<br />
(f(2)implies f(3))</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
forall(x, f(y)implies f(x)), 2)</span>
</p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">f(1)</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">not f(2)</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">f(2) XXX</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">===================================</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">true.</span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:">?- </span></p>
<p class="MsoNormal">
<p class="MsoNormal" style="text-align:justify">E’ stampato a video un unico ramo<br />
chiuso: questo vuol dire che la formula di partenza <span style="font-family: Symbol;mso-ascii-font-family:"><span style="mso-char-type: symbol;mso-symbol-font-family:Symbol">Ø</span></span><span style="font-family: Symbol;mso-ascii-font-family:"><span style="mso-char-type: symbol;mso-symbol-font-family:Symbol">$</span></span>y<span style="font-family: Symbol;mso-ascii-font-family:"><span style="mso-char-type: symbol;mso-symbol-font-family:Symbol">&#8220;</span></span>x(F(y)<span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol">®</span></span>F(x))<br />
è insoddisfacibile, e quindi la sua negata <span style="font-family:Symbol; mso-ascii-font-family:"><span style="mso-char-type: symbol;mso-symbol-font-family:Symbol">$</span></span>y<span style="font-family: Symbol;mso-ascii-font-family:"><span style="mso-char-type: symbol;mso-symbol-font-family:Symbol">&#8220;</span></span>x(F(y)<span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol">®</span></span>F(x))<br />
è valida.
</p>
<p class="MsoNormal">
<h2>Esempio formula soddisfacibile</h2>
<p class="MsoNormal">Verifichiamo la non validità di una formula<span style="font-family:Symbol;mso-ascii-font-family:"><span style="mso-char-type:symbol;mso-symbol-font-family:Symbol"> </span></span>. Con un’analisi semantica si può facilmente vedere che {f(0,1), f(1,0)} è un contro-modello nel dominio {0, 1}. Neghiamo la formula e proviamo a dimostrarla con il metodo dei Tableaux:</p>
<p class="MsoNormal">
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">?- prova(not<br />
(forall(y,exists(x,f(x,y))) implies exists(x,forall(y, f(x,y))))).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">===========[RAMO<br />
APERTO]===========</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not<br />
(forall(y, exists(x, f(x, y)))implies exists(x, forall(y, f(x, y))))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(x,<br />
forall(y, f(x, y)), 0)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not forall(y,<br />
f(1, y))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">forall(y,<br />
exists(x, f(x, y)), 0)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
f(x, 2))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
f(x, 1))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(x,<br />
forall(y, f(x, y)), 1)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not forall(y,<br />
f(4, y))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not forall(y,<br />
f(3, y))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not forall(y,<br />
f(2, y))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">forall(y,<br />
exists(x, f(x, y)), 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
f(x, 7))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
f(x, 6))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
f(x, 5))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
f(x, 3))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
f(x, 4))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">forall(y,<br />
exists(x, f(x, y)), 7)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(x,<br />
forall(y, f(x, y)), 4)</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not f(1, 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">f(3, 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">f(4, 1)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not f(4, 5)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not f(3, 6)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not f(2, 7)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">f(8, 7)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">f(9, 6)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">f(10, 5)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">===================================</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">true.</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">?-</span></p>
<p class="MsoNormal">
<p class="MsoNormal" style="text-align:justify">Siccome il tableau sviluppato per la formula negata non chiude, allora la formula originale <span style="font-family:Symbol; mso-ascii-font-family:"><span style="mso-char-type: symbol;mso-symbol-font-family:Symbol"> </span></span>non è valida. Per sapere se essa è soddisfacibile o insoddisfacibile<br />
sviluppiamo un altro tableau non negando la formula:
</p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">?-<br />
prova((forall(y,exists(x,f(x,y))) implies exists(x,forall(y, f(x,y))))).</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">===========[RAMO<br />
APERTO]===========</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
exists(x, f(x, y)))implies exists(x, forall(y, f(x, y)))</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
forall(y, exists(x, f(x, y)))</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 0)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 2)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 3)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 4)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 5)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 6)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 7)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), <img src='http://www.fireteam.it/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 9)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
exists(x, f(x, 1), 10)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(1, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(2, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(3, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(4, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(5, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(6, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(7, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(8, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(9, 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">not<br />
f(10, 1)</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">===================================</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">===========[RAMO<br />
APERTO]===========</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
exists(x, f(x, y)))implies exists(x, forall(y, f(x, y)))</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">exists(x,<br />
forall(y, f(x, y)))</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 0)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 2)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 3)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 4)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 5)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 6)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 7)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), <img src='http://www.fireteam.it/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 9)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">forall(y,<br />
f(1, y), 10)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
1)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
2)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
3)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
4)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
5)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
6)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
7)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
 <img src='http://www.fireteam.it/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
9)</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">f(1,<br />
10)</span>
</p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">===================================</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">true.</span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:"> </span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:10.0pt; mso-bidi-font-size:12.0pt;font-family:">?-</span></p>
<p class="MsoNormal" style="text-align:justify">
<p class="MsoNormal" style="text-align:justify">Abbiamo due rami aperti, quindi la formula è soddisfacibile.</p>
<p class="MsoNormal">
<h2>Ultimo esempio d’uso</h2>
<p class="MsoNormal">Vogliamo provare la validità della formula.</p>
<p class="MsoNormal">
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">?- prova(not<br />
(exists(x, exists(y,r(x,y) or r(y,x)) ) implies exists(x,exists(y,r(x,y))) )).</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">===========[RAMO<br />
CHIUSO]===========</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not<br />
(exists(x, exists(y, r(x, y)or r(y, x)))implies exists(x, exists(y, r(x, y))))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
exists(y, r(x, y)or r(y, x)))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(y,<br />
r(1, y)or r(y, 1))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">r(1, 2)or<br />
r(2, 1)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(x,<br />
exists(y, r(x, y)), 0)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
r(2, y), 0)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
r(1, y), 0)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
r(1, y), 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
r(2, y), 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(x,<br />
exists(y, r(x, y)), 2)</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">r(1, 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not r(2, 1)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not r(2, 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not r(1, 1)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not r(1, 2)<br />
XXX</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">===================================</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">===========[RAMO<br />
CHIUSO]===========</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not<br />
(exists(x, exists(y, r(x, y)or r(y, x)))implies exists(x, exists(y, r(x, y))))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(x,<br />
exists(y, r(x, y)or r(y, x)))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">exists(y,<br />
r(1, y)or r(y, 1))</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">r(1, 2)or<br />
r(2, 1)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(x,<br />
exists(y, r(x, y)), 0)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
r(2, y), 0)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
r(2, y), 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(x,<br />
exists(y, r(x, y)), 2)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not exists(y,<br />
r(1, y), 0)</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">r(2, 1)</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">not r(2, 1)<br />
XXX</span>
</p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">===================================</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">true.</span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:"> </span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;mso-bidi-font-size:12.0pt; font-family:">?-</span></p>
<p class="MsoNormal">
<p class="MsoNormal">Dall’output dell’elaborazione si vede che il tableau<br />
sviluppato ha due rami chiusi, quindi la formula è valida.</p>
<p><span style="font-size:12.0pt;font-family:"><br style="page-break-before:always" /><br />
</span></p>
<h1>Codice sorgente completo</h1>
<div style="mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.5pt; padding:0cm 0cm 1.0pt 0cm">
<p class="MsoNormal" style="tab-stops:65.35pt;border:none;mso-border-bottom-alt: solid windowtext 1.5pt;padding:0cm;mso-padding-alt:0cm 0cm 1.0pt 0cm">“tableaux.pl”</p>
</div>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Definizione degli operatori logici </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">:-<br />
op(650, xfy, sse). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">:-<br />
op(640, xfy, implies). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">:-<br />
op(630, yfx, or). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">:-<br />
op(620, yfx, and). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">:-<br />
op(610, fy, not). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">% Per i<br />
quantificatori usiamo forall(x,fbf) e exists(x,fbf). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">% Le<br />
costanti devono essere dei numeri, e le lettere in minuscolo sono le variabili </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">:-<br />
op(600, xfy, \). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Predicato per verificare il tipo </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>delle formule ben formate </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_alpha(_<br />
and _). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_alpha(_<br />
sse _). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_alpha(not<br />
(_ or _)). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_alpha(not<br />
(_ implies _)). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_beta(_<br />
or _). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_beta(_<br />
implies _). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_beta(not<br />
(_ and _)). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_beta(not<br />
(_ sse _)). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_delta(exists(<br />
_ , _ )). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_delta(not<br />
forall( _ , _ )). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_fresh_gamma(forall(<br />
X , Y ), forall( X , Y , 0)). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_fresh_gamma(not<br />
exists( X , Y ), not exists( X , Y , 0)). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_gamma(forall(<br />
_ , _ , _ )). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">is_gamma(not<br />
exists( _ , _ , _ )). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Controllo formula atomica ground </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">atomo_ground(X)<br />
:- compound( X ), X =.. [_|Terms], lista_interi(Terms). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">lista_interi([]).<br />
</span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">lista_interi([Termine<br />
| Terms]) :- integer(Termine), lista_interi(Terms). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Controllo formula atomica </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">atomo(X)<br />
:- compound( X ), X =.. Parametri, parametri_validi(Parametri). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">parametri_validi([]).<br />
</span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">parametri_validi([Parametro<br />
| Tail]) :- atomic(Parametro), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Parametro \== not, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Parametro \== and, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Parametro \== or, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Parametro \== implies, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Parametro \== sse, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Parametro \== forall, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Parametro \== exists, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>parametri_validi(Tail). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Controllo formula ben formata </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
X and Y ) :- !, fbf_chiusa(X),fbf_chiusa(Y). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
X or Y ) :- !, fbf_chiusa(X), fbf_chiusa(Y). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
X implies Y ) :- !, fbf_chiusa(X), fbf_chiusa(Y). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
X sse Y ) :- !, fbf_chiusa(X), fbf_chiusa(Y). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
forall(X,Y) ) :- atomic(X),instantiate(Y,X,-1,Y1),!, fbf_chiusa(Y1). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
exists(X,Y) ) :- atomic(X), instantiate(Y,X,-1,Y1),!,fbf_chiusa(Y1). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
not X ) :- ! ,fbf_chiusa(X). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">fbf_chiusa(<br />
X ) :- atomo_ground(X).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Instanziazione di fbf quantificate </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
X and Y , Var , Par , X1 and Y1) :- !, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(X,Var,Par,X1), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
X or Y , Var , Par , X1 or Y1) :- !, </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>instantiate(X,Var,Par,X1), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
X implies Y , Var , Par , X1 implies Y1) :- !, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(X,Var,Par,X1), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>instantiate(Y,Var,Par,Y1). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
X sse Y , Var , Par , X1 sse Y1) :- !, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(X,Var,Par,X1), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
forall(X,Y),Var,Par,forall(X,Y1)) :- X \== Var, </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%le<br />
occorrenze interne della variabile sono bounded nel quantificatore </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
forall(X,Y),Var,_,forall(X,Y)) :- X == Var, !.<span style="mso-spacerun:yes"><br />
</span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
exists(X,Y),Var,Par,exists(X,Y1)) :- X \== Var, </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>instantiate(Y,Var,Par,Y1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%le<br />
occorrenze interne della variabile sono bounded nel quantificatore </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
exists(X,Y),Var,_,exists(X,Y)) :- X == Var,!. </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
not X,Var,Par, not X1 ) :-!, instantiate(X,Var,Par,X1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">instantiate(<br />
X,Var,Par,X1 ) :- atomo(X), !, substitute_occurrences(X,Var,Par,X1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">substitute_occurrences(X,Var,Par,X1):-<br />
X =.. [Pred|Terms], substitute(Terms,Var,Par,Terms1),X1=.. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">[Pred|Terms1].<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">substitute([],_,_,[]).<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">substitute([Term<br />
| Tail],Var,Par,[Term1 | Tail1]) :- Term == Var,Term1 = Par,!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">substitute(Tail,Var,Par,Tail1).<br />
</span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">substitute([Term<br />
| Tail],Var,Par,[Term1 | Tail1]) :- Term \== Var,Term1 = Term,!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">substitute(Tail,Var,Par,Tail1).<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>calcolo del Tableau </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">prova(Fbf)<br />
:- tclose(Fbf, 10). % il numero 10 e&#8217; un valore indicativo </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">tclose(Fbf,<br />
Limite) :- fbf_chiusa(Fbf), closed_branch([Fbf],[],[],[],[],[], Limite, 0, []).<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"> </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"> </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"> </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([],[],[],[],[],Ls,_,_,Elaborate)<br />
:- !, stampa_ramo([],[],[],[],[],Ls,Elaborate,&#8217;APERTO&#8217;).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([Fbf|_],As,Ds,Bs,Gs,Ls,_,_,Elaborate)<br />
:- chiude(Fbf,As,Ds,Bs,Gs,Ls), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>stampa_ramo([Fbf],As,Ds,Bs,Gs,Ls,Elaborate,&#8217;CHIUSO&#8217;). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([Fbf|Fbfs],As,Ds,Bs,Gs,Ls,Limite,Params,Elaborate):-<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>\+<br />
chiude(Fbf,As,Ds,Bs,Gs,Ls), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>push_formula(Fbf,As,Ds,Bs,Gs,Ls,As1,Ds1,Bs1,Gs1,Ls1), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>closed_branch(Fbfs,As1,Ds1,Bs1,Gs1,Ls1,Limite,Params,Elaborate).<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([],As,Ds,Bs,Gs,Ls,Limite,Params,Elaborate)<br />
:- closed_branch(As,Ds,Bs,Gs,Ls,Limite,Params,Elaborate).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"> </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%alpha </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([Formula|As],Ds,Bs,Gs,Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_alpha(Formula,Alpha1,Alpha2), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([Alpha1,Alpha2],As,Ds,Bs,Gs,Ls,Limite,Params,[Formula|Elaborate]).<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%delta </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([],[Formula|Ds],Bs,Gs,Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Params &lt; Limite, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_delta(Formula,Delta1,Limite,Params), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Params1 is Params + 1, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([Delta1],[],Ds,Bs,Gs,Ls, Limite,Params1,[Formula|Elaborate]).<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%delta </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([],[Formula|Ds],Bs,Gs,Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Params &gt;= Limite, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([],[],Ds,Bs,Gs,Ls, Limite,Params,[Formula|Elaborate]). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"> </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%beta<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([],[],[Formula|Bs],Gs,Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_beta(Formula,Beta1,Beta2), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>closed_branch([Beta1],[],[],Bs,Gs,Ls,<br />
Limite,Params,[Formula|Elaborate]), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>closed_branch([Beta2],[],[],Bs,Gs,Ls,<br />
Limite,Params,[Formula|Elaborate]). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%gamma<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([],[],[],[Formula|Gs],Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>is_gamma(Formula), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Params &lt; Limite, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_gamma(Formula,Gammas,Limite,Params,Params1), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>incrementa(Formula, Formula1,<br />
Params1), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>append(Gs, [Formula1], Gs2), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>closed_branch(Gammas,<br />
[],[],[],Gs2,Ls, Limite,Params1,[Formula|Elaborate]).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>%gamma<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">closed_branch([],[],[],[Formula|Gs],Ls,Limite,Params,Elaborate)<br />
:-<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>is_gamma(Formula), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Params &gt;= Limite, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_gamma(Formula,Gammas,Limite,Params,Params1),</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>closed_branch(Gammas,<br />
[],[],[],Gs,Ls, Limite,Params1,[Formula|Elaborate]).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_alpha(<br />
A and B, A, B ). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_alpha(<br />
not ( A implies B ), A, not B ). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_alpha(<br />
not ( A or B ), not A, not B ). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_alpha(<br />
A sse B, A implies B, B implies A). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_beta(<br />
A or B, A, B ). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_beta(<br />
A implies B, not A, B ). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_beta(<br />
not ( A and B ), not A, not B ). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_beta(<br />
not ( A sse B ), not ( A implies B ), not ( B implies A ) ). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_delta(exists(X,Fbf),Fbf1,_,N):-<br />
N1 is N+1, instantiate( Fbf , X , N1 , Fbf1). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_delta(not<br />
forall(X,Fbf),not Fbf1,_,N):- N1 is N+1, instantiate( Fbf , X , N1 , Fbf1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_gamma(forall(X,<br />
Fbf, N), Gammas, Limite, Params, Params1) :- </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_gamma(Gammas, X, Fbf, N, N, Limite, Params, Params1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_gamma(not<br />
exists(X, Fbf, N), Gammas, Limite, Params, Params1) :- </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>regola_gamma(Gammas, X, not Fbf,<br />
N, N, Limite, Params, Params1). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">% la<br />
regola gamma introduce parametri nuovi</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_gamma([],<br />
_, _, N, _, Limite, Params, _) :- N == Params, N<span style="mso-spacerun:yes"> </span>&gt;= Limite,!.</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_gamma([Fbf1],<br />
X, Fbf, N, _, Limite, Params, Params1) :- N == Params, Params &lt; Limite,</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Params1 is Params<br />
+ 1, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>instantiate( Fbf<br />
, X , Params1 , Fbf1).<span style="mso-spacerun:yes"><br />
</span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">% la<br />
regola gamma non introduce parametri nuovi<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_gamma([Fbf1<br />
| Gammas], X, Fbf, N, Next, _, Params, Params1) :- N &lt; Params, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>Next &lt; Params,<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span><span style="mso-spacerun:yes"> </span>Next1 is Next+1, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>instantiate( Fbf<br />
, X , Next1 , Fbf1), </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>!, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>regola_gamma(Gammas, X, Fbf, N, Next1, _, Params, Params1).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">regola_gamma([],<br />
_, _, N, Next, _, Params, Params) :- N &lt; Params , Next == Params. </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>push_formula(not not<br />
Fbf,As,Ds,Bs,Gs,Ls,As1,Ds1,Bs1,Gs1,Ls1) :- !, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As1,Ds1,Bs1,Gs1,Ls1).<br />
</span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,[Fbf<br />
| As],Ds,Bs,Gs,Ls) :- is_alpha(Fbf), !.<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,[Fbf<br />
| Ds],Bs,Gs,Ls) :- is_delta(Fbf), !.<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,[Fbf<br />
| Bs],Gs,Ls) :- is_beta(Fbf), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,[Fbf1<br />
| Gs],Ls) :- is_fresh_gamma(Fbf, Fbf1), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,[Fbf<br />
| Gs],Ls) :- is_gamma(Fbf), !.<span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,Gs,[Fbf<br />
| Ls]) :- atomo(Fbf), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">push_formula(not<br />
Fbf,As,Ds,Bs,Gs,Ls,As,Ds,Bs,Gs,[not Fbf | Ls]) :- atomo(Fbf), !.<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(not<br />
Fbf,_,_,Bs,_,_) :- is_alpha(Fbf), member(Fbf, Bs), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(not<br />
Fbf,_,_,_,Gs,_) :- is_delta(Fbf), member(Fbf, Gs), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(not<br />
Fbf,As,_,_,_,_) :- is_beta(Fbf), member(Fbf, As), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(not<br />
Fbf,_,Ds,_,_,_) :- is_gamma(Fbf), member(Fbf, Ds), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(not<br />
Fbf,_,_,_,_,Ls) :- atomo_ground(Fbf), member(Fbf, Ls), !. </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(Fbf,_,_,Bs,_,_)<br />
:- is_alpha(Fbf), member(not Fbf, Bs), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(Fbf,_,_,_,Gs,_)<br />
:- is_delta(Fbf), member(not Fbf, Gs), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(Fbf,As,_,_,_,_)<br />
:- is_beta(Fbf), member(not Fbf, As), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(Fbf,_,Ds,_,_,_)<br />
:- is_gamma(Fbf), member(not Fbf, Ds), !. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">chiude(Fbf,_,_,_,_,Ls)<br />
:- atomo_ground(Fbf), member(not Fbf, Ls), !. </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<br />
incrementa(Fbf, Fbf1) :- Fbf1 e&#8217; la formula di tipo gamma Fbf con il campo<br />
contatore N incrementato </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">incrementa(forall(X,<br />
Fbf, _), forall(X, Fbf, Params), Params). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">incrementa(not<br />
exists(X, Fbf, _), not exists(X, Fbf, Params), Params). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Utilita&#8217; </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<br />
maximum(X, Y, Z) :- Z e&#8217; il massimo tra X e Y </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">maximum(X,Y,X)<br />
:- X &gt;= Y. </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">maximum(X,Y,Y)<br />
:- X &lt; Y. </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<br />
delete(X, Lista, Lista1) :- Lista1 e&#8217; la lista risultante dalla cancellazione<br />
di X da Lista </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">delete(X,<br />
[X|Rest], Rest). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">delete(X,<br />
[Y | Rest], [Y|Deleted]) :- !, delete(X, Rest, Deleted).<span style="mso-spacerun:yes"> </span></span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">nonmember(_,<br />
[]). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">nonmember(X,<br />
[Y|Ys]):- X \== Y, !, nonmember(X, Ys). </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%<span style="mso-spacerun:yes"> </span>Utilita&#8217; per la stampa </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br />
</span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">stampa_ramo(Fbf,As,Ds,Bs,Gs,Ls,Elaborate,Tipo)<br />
:- </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>write(&#8217;===========[RAMO '), write(Tipo),<br />
write(']===========&#8217;), nl, </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Elaborate), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(As), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Ds), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Bs), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Gs), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_formule(Ls), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>stampa_ultima_formula(Fbf), </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span>nl, </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"><br />
</span>write(&#8217;===================================&#8217;), nl, nl. </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">stampa_formule(<br />
[] ). </span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">stampa_formule(<br />
[Formula | Formulas] ) :- stampa_formule(Formulas), write(Formula), nl. </span>
</p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:"><span style="mso-spacerun:yes"> </span></span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">stampa_ultima_formula([]).<br />
</span></p>
<p class="MsoNormal" style="tab-stops:65.35pt"><span style="font-size:8.0pt; font-family:">stampa_ultima_formula([Fbf])<br />
:- write(Fbf), write(&#8217; XXX&#8217;).</span><span style="font-size:8.0pt;font-family: "> </span></p>
<p></mce></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2010/03/metodo-dei-tableaux-analitici-in-prolog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Primi sviluppi dell&#8217;Intelligenza Artificiale</title>
		<link>http://www.fireteam.it/2010/01/primi-sviluppi-intelligenza-artificiale/</link>
		<comments>http://www.fireteam.it/2010/01/primi-sviluppi-intelligenza-artificiale/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 14:25:20 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Biblioteca]]></category>
		<category><![CDATA[cibernetica]]></category>
		<category><![CDATA[Damasio]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[Marr]]></category>
		<category><![CDATA[Newell & Simon]]></category>
		<category><![CDATA[Turing]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=775</guid>
		<description><![CDATA[E&#8217; difficile dare una definizione di Intelligenza Artificiale (IA) in quando essa è vista sia dal punto di vista ingegneristico (che punta a costruire macchine intelligenti per assistere l&#8217;uomo), sia dal punto di vista psicologico (che punta a riprodurre nelle macchine le caratteristiche dell&#8217;attività cognitiva umana).
Seppur con idee diverse, i pionieri dell&#8217;IA (McCarthy, Minsky, Rochesterm, [...]]]></description>
			<content:encoded><![CDATA[<p>E&#8217; difficile dare una definizione di Intelligenza Artificiale (IA) in quando essa è vista sia dal punto di vista ingegneristico (che punta a costruire macchine intelligenti per assistere l&#8217;uomo), sia dal punto di vista psicologico (che punta a riprodurre nelle macchine le caratteristiche dell&#8217;attività cognitiva umana).</p>
<p>Seppur con idee diverse, i pionieri dell&#8217;IA (McCarthy, Minsky, Rochesterm, e Shannon) videro nel calcolatore digitale uno strumento con capacità di elaborazione ineguagliate, quindi uno strumento adatto al confronto con alcuni aspetti della mente umana.<br />
Si cominciarono a sviluppare i primi programmi relativi ad ambiti ben delimitati in cui c&#8217;erano  solo regole esplicite per l&#8217;elaborazione simbolica e poca conoscenza specializzata. Motivo di questo inizio era la scarsa capacità di memoria e di calcolo dei calcolatori di quei tempi.<br />
Successivamente si parte con lo sviluppo di sistemi esperti, dove la conoscenza specializzata nel campo ci porta ad avere buone prestazioni.</p>
<p>La diffusione di queste tecniche di IA ci conferma il successo dal punto di vista ingegneristico, ma cosa possiamo dire dal punto di vista psicologico?<br />
Cosa implica la costruzione di macchine che riproducono caratteristiche essenziali dell&#8217;attività umana? Dove si colloca l&#8217;IA nell&#8217;ambito delle ricerche sul sistema cervello-mente che coinvolgono le neuroscienze e la psicologia?</p>
<p><span id="more-775"></span></p>
<h2>Turing e la Macchina di Turing Universale</h2>
<p>Abbinando le MdT (Macchine di Turing) alle codifiche di Godel, nasce un modo di codificare le MdT. Si ha inoltre un <em>procedimento effettivo</em> per la codifica e la decodifica.<br />
Dalle MdT codificate, Turing arriva alla macchina universale, che è una particolare MdT che, accettando in input la descrizione di una qualsiasi MdT, riesce a comportarsi come essa.</p>
<p>Dalla <strong>MdT Universale</strong> nasce la nozione di <strong>Macchina Programmabile</strong>.<br />
Da questa considerzione ci si chiese se le macchine possano essere intelligenti. Su questo Turing scrive l&#8217;articolo &#8220;Macchine calcolatrici e intelligenza&#8221;.</p>
<h2>Macchine calcolatrici e intelligenza</h2>
<p>Turing considera la domanda: &#8220;<em>Possono pensare le macchine?</em>&#8220;. In questa domanda i termini <strong>macchina</strong> e <strong>pensare</strong> non sono di facile definizione.</p>
<p>Possiamo definire la parola <strong>macchina</strong> possiamo imporre che la macchina sia composta da tre parti: memoria, unità operativa, e governo; dove la memoria è un deposito di informazioni, l&#8217;unità operativa è la parte atta ad eseguire operazioni, ed il governo coordina l&#8217;unità operativa e la memoria.<br />
Quindi scendendo più in dettaglio riusciamo a definire cos&#8217;è una macchina.</p>
<p>Cosa possiamo invece definire la parola <strong>pensare</strong>? Turing non riesce a farlo.<br />
Per questo pensa di riformulare la domanda &#8220;<em>Possono pensare le macchine?</em>&#8221; con un&#8217;altra. Riformula il problema in termini di un gioco dove si trovano tre persona A (un uomo), B (una donna), e C (un&#8217;interrogante). C è isolato in una stanza, e può comunicare con A e B mediante messaggi di tipo linguistico.<br />
Lo scopo di C, che parla con due individui, è di capire chi è la donna e chi è l&#8217;uomo. B (che è la donna) ha il compito di aiutare l&#8217;interrogante C, mentre lo scopo di A (l&#8217;uomo) è quello di ingannarlo.<br />
La domanda riformulata è: &#8220;<em>Che cosa accadrà se una macchina prende il posto di A nel gioco? La frequenza delle risposte errate da parte di C sarà la stessa di quando il gioco si svolge tra uomini?</em>&#8220;.</p>
<p>Chiamiamo questo <strong>Test di Turing</strong>.</p>
<h3>Test di Turing e Intelligenza</h3>
<p>Superare il test di Turing, non è una condizione né necessaria, né sufficiente per stabilire se un individuo o una macchina è intelligente.</p>
<ul>
<li>Condizione Necessaria: se un essere è intelligente deve      necessariamente superare il Test di Turing. Ma ci sono situazioni, come      quelle delle persone nello stato locked-in (ad esempio il famoso caso di      Piergiorgio Welby), in cui l&#8217;individuo non è in grado di superare il test,      ma comunque non possiamo dire che tale individuo non è intelligente.</li>
<li>Condizione Sufficiente: supponiamo una macchina con un      programma complicatissimo, che è fatta apposta per superare il Test di      Turing. Questa macchina sa solo superare questo test e basta: possiamo      definirela intelligente?</li>
</ul>
<p>Quindi il superamento del Test di Turing da parte di una macchina non è né condizione necessaria, né condizione sufficiente per affermare che la macchina stressa sia intelligente.</p>
<h3>Osservazioni all&#8217;articolo</h3>
<p><span style="text-decoration: underline;">Prima Osservazione: Funzionalismo</span></p>
<p>Notiamo che in questo gioco la macchina da risposte di tipo linguistico; infatti Turing divide nettamente le capacità fisiche di un essere umano, dalle capacità intellettuali (o mentali). Questo non è vero nell&#8217;eccezione Darwiniana in cui le capacità mentali di un essere vivente sono di fondamentale importanza per coordinare le capacità motorie, e permettono così di sopravvivere.<br />
Essendo la mente umana composta da materiali diversi da quelli con i quali è costruita una macchina, Turing adotta il funzionalismo, ossia paragona il funzionamento degli oggetti anche se costruiti in modo diverso.</p>
<p><span style="text-decoration: underline;">Seconda Osservazione: La mente funziona a stati discreti</span></p>
<p>I calcolatori digitali sono indubbiamente delle macchine a <em>stati discreti</em>. Ovvero si muovono a scatti improvvisi ben distinguibili l&#8217;uno dall&#8217;altro.<br />
Anche se in realtà in natura niente è discreto; se indaghiamo un calcolatore digitale funziona anch&#8217;esso in modo <em>continuo</em>. Ma consideriamolo una macchina a stati discreti.<br />
<em>Ci conviene discretizzare la mente paragonandola ad un calcolatore digitale</em>?</p>
<p><span style="text-decoration: underline;">Terza Osservazione: I calcolatori digitali non sono caotici</span></p>
<p>Dato un input in ingresso ad una macchina riusciamo a predire tutti i suoi stati, ed il suo output, in modo esatto. Nel mondo invece vige la teoria del caos, nella quale piccole variazioni nelle condizioni iniziali producono grandi variazioni nel comportamento a lungo termine di un sistema. Ad esempio il battito d&#8217;ali di una farfalla può essere la causa di un uragano dall&#8217;altra parte del mondo.</p>
<h3>Obiezioni Contrarie all&#8217;argomento principale dell&#8217;articolo</h3>
<p><span style="text-decoration: underline;">Obiezione Teologica:</span> &#8220;Solo Dio ha il potere di creare esseri pensanti&#8221;.<br />
Questa obiezione pone serie restrizioni alla provvidenza divina: chi ci dice che Dio non ci abbia dato il potere di creare macchine pensanti?</p>
<p><span style="text-decoration: underline;">Obiezione della Testa nella Sabbia:</span> Questa è l&#8217;obiezione di chi ha paura delle macchine pensanti. A queste persone piace sentirsi superiori di ogni altra cosa, e si sentono minacciati da questo tentativo di creare macchine pensanti.</p>
<p><span style="text-decoration: underline;">Obiezione Matematica:</span> I teoremi di incompletezza di Godel, ed altri risultati ad esso annessi, dimostrano che le macchine non possono conoscere tutte le verità. Quindi esistono dei limiti, e si sostiene che la mente umana non abbia questi limiti.<br />
Ma non è giusto condannare così i calcolatori; diamo risposte errate anche noi. Inoltre ci possono essere uomini più abili di una macchina, ma possono essere costruite altre macchine più abili di questi uomini. Quindi non ci possono essere uomini più abili di tutte le macchine.</p>
<p><span style="text-decoration: underline;">Obiezione dell&#8217;Autocoscienza</span>: Possiamo dividere la coscienza in &#8220;essere consapevole del proprio stato&#8221;, ed &#8220;essere consapevoli di provare&#8221;. Possiamo costruire macchine con medoti di <strong>Machine Learning</strong> che sono consapevoli del proprio stato, ma non ancora riusciamo ad immaginare macchine che sappiano provare dei sentimenti.</p>
<p><span style="text-decoration: underline;">Obiezioni basate su incapacità varie</span>: ad esempio una macchina è capace di gustare le fragole con la panna.<br />
Queste obiezioni nascono dal fatto che vogliamo far assomigliare le macchine agli essere umani. Ma, non essendo le macchine degli essere umani, è difficile avere un rapporto di amicizia tra un uomo ed una macchina.</p>
<p><span style="text-decoration: underline;">Obiezione di Lady Lovelace:</span> &#8220;La macchina può eseguire solo quello che gli diciamo di fare!&#8221;. Questa obiezione è vecchia e risale ai tempi della macchina universale di Babbage.<br />
Con i moderni metodi di <strong>Machine Learning</strong> possiamo avere delle macchine che riescono ad apprendere, anche se sono formate da un nucleo di base non modificabile. Quindi anche essendo una macchina <em>deterministica</em>, possiamo avere macchine che modificano il proprio comportamento man mano che apprendono nuove regole.</p>
<p><span style="text-decoration: underline;">Obiezione fondata sulla continuità del sistema nervoso:</span> Ancora una volta ci rifacciamo al concetto di funzionalismo, secondo il quale cerchiamo di ottenere solo un comportamento intelligente, e non pretendiamo che internamente le cose funzionino allo stesso modo.</p>
<h3>Possono le macchine pensare?</h3>
<p>Dopo l&#8217;articolo di Turing partono gli studi per costruire macchine in grado di competere con l&#8217;uomo in ambiti intellettuali. Ma quel&#8217;è la strada migliore per iniziare a costruire queste macchine?</p>
<p>L&#8217;<em>IA</em> comincia a sviluppare programmi per calcolatori digitali capaci di svolgere attività molto astratte, come giocare a scacchi.<br />
La <em>robotica</em> invece inizia mettendo in risalto il comportamento intelligente degli esseri viventi, e comincia a costruire dispositivi meccanici che si comportano in modo intelligente.</p>
<p>Parallelamente a queste due nasce anche la branca della <strong>Machine Learning</strong>, un&#8217;intuizione geniale da parte di Turing.</p>
<h2>La cibernetica prima dei calcolatori digitali</h2>
<p>La cibernetica nasce con i sistemi a retroazione. La differenza con il punto di vista di Turing, è che questa volta <span style="text-decoration: underline;">il comportamento intelligente è visto come un comportamento flessibile-adattativo all&#8217;ambiente</span>: c&#8217;è un tentativo di collegare questi sistemi a retroazione ai sistemi biologici, con un conseguente collegamento alla scienza molto più forte.<br />
Da un altro punto di vista notiamo che i cibernetici partono dal basso, costruendo prima sistemi molto semplici, mentre Turing punta a riprodurre l&#8217;attività mentale umana con un macchina&#8230; un compito arduo.</p>
<p>Un primo esempio di sistema a retroazione è la valvola di sfiato della caldaia di una locomotiva a vapore; il suo compito era quello di tenere la pressione costante all&#8217;interno della caldaia, in modo da mantenere costante la velocità del treno. Quindi quando la pressione era troppo alta, la valvola faceva uscire del vapore per farla diminuire.<br />
Questo primo meccanismo di sistema a retroazione puntava a correggere l&#8217;errore, in un ciclo di questo tipo:</p>
<ol>
<li>Osservare l&#8217;output del sistema</li>
<li>Misurare l&#8217;errore</li>
<li>Apportare le modifiche atte a correggere l&#8217;errore</li>
</ol>
<p>Questi meccanismi hanno delle caratteristiche in comune con i sistemi biologici: ad esempio il corpo umano ha un meccanismo simile per controllare la temperatura corporea (la sudorazione).<br />
Rosenblueth, Wiener, e Bigelow, nel loro articolo &#8220;<em>Coportamento, Scopo, e Teleologia</em>&#8221; affermano che i metodi di studio sia per gli organismi viventi, sia per le macchine, sono simili in quanto non sono state trovare delle caratteristiche qualitativamente diverse che caratterizzano un gruppo e non l&#8217;altro.</p>
<p>Possiamo dividere le cause dei mutamenti della natura in quelli provocati da:<br />
- cause efficienti: è l&#8217;agente che determina operativamente il mutamento<br />
- cause finali: è l&#8217;intenzione di qualche essere vivente a raggiungere un certo scopo</p>
<p>I cibernetici puntano a descrivere il comportamento intelligente usando solo le cause efficienti, in quanto le cause finali sono caratteristiche dei sistemi biologici.<br />
Come esempio possiamo considerare il comportamento della falena che è stato descritto da uno studioso americano con sole cause efficienti.</p>
<h3>Comportamento, Scopo, e Teleologia</h3>
<p>Il comportamento intelligente può essere diviso in due grosse classi: il comportamento rivolto ad uno scopo (finalizzato), e il comportamento non rivolto ad uno scopo (causale).</p>
<p>Noi ci interessiamo al comportamento rivolto ad uno scopo. Ma cos&#8217;è uno scopo? Abbiamo un <strong>tentativo riduzionista</strong>, <span style="text-decoration: underline;">che riduce lo scopo ad un oggetto, e il suo raggiungimento è uno spostamento spazio/temporale dell&#8217;oggetto stesso</span>.<br />
Su questa visione di vedere uno scopo si inseriscono i critici obiettando il fatto che non sempre lo scopo è un oggetto.</p>
<p>Il comportamento rivolto ad uno scopo può essere diviso a sua volta in comportamento rivolto ad uno scopo con retroazione (o teleologico) o senza retroazione (non teleologico).<br />
Il comportamento rivolto ad uno scopo senza retroazione raggruppa tutti quei casi in cui il movimento è talmente veloce in cui è impensabile che ci sia del tempo utile a modificare il movimento mentre lo si sta facendo. Ad esempio, il comportamento di una rana mentre colpisce una mosca per mangiarsela, è senza retroazione.</p>
<p>Ci interesseremo al comportamento rivolto ad uno scopo con retroazione, nel quale l&#8217;azione che si sta svolgendo è modificabile mentre la si sta facendo. Questo tipo di comportamento è più efficace del comportamento senza retroazione, specialmente quando lo scopo è un oggetto fermo.</p>
<p>Il comportamento rivolto ad uno scopo con retroazione può essere ulteriormente diviso in comportamento rivolto ad uno scopo con retroazione non predittivo o non estrapolativo (la falena che cammina verso la luce) e predittivo o estrapolativo (il gatto che balza per catturare un topo nella posizione in cui il topo dovrebbe stare dopo il balzo, quindi il gatto è capace di estrapolare la posizione del topo in un istante di tempo futuro).</p>
<h3>Intelligenza e Comportamento rivolto ad uno scopo</h3>
<p>Nell&#8217;articolo &#8220;<em>Coportamento, Scopo, e Teleologia</em>&#8221; non sono state individuate le condizioni necessarie e sufficienti per affermare che un agente ha il comportamento intelligente per raggiungere uno scopo. Questo perché il tentativo riduzionista per la descrizione di cosa si intende per scopo ci vincola troppo.</p>
<ul>
<li>Condizione Necessaria: Supponiamo ci sia un cavaliere      alla ricerca del Santo Graal. Se il Santo Graal non esiste, come descriviamo      lo scopo di questo cavaliere se imponiamo che lo scopo sia un oggetto?</li>
<li>Condizione Sufficiente: Supponiamo una persona si      sveglia all&#8217;improvviso durante la notte, e spara un colpo di pistola allo      specchio. Come descriviamo lo scopo di questo signore? Il suo intento non      era sparare nello specchio, ma l&#8217;ha fatto per motivi che non conosciamo.</li>
</ul>
<p>Quindi la definizione di Scopo come una relazione spazio/temporale relativa ad un oggetto è troppo restrittiva per descrivere il comportamento intelligente rivolto ad uno scopo.</p>
<h3>Il ruolo dei Modelli nella Scienza</h3>
<p>La cibernetica lavora con i <strong>modelli</strong>. Obiettivo della scienza è ottenere la <strong>comprensione</strong> ed il <strong>controllo</strong> di una qualche parte dell&#8217;universo. Ad esempio la lancetta del barometro che si abbassa ha come causa  (comprensione) l&#8217;abbassamento della pressione; ed anche, la cura per una malattia (controllo) mediante antibiotici.</p>
<p>Ma nessuna parte dell&#8217;universo si lascia afferrare senza un minimo di astrazione. I <strong>modelli</strong> ci aiutano proprio a questo: un modello formale (o intellettuale) rappresenta con astrazione un <strong>sistema studiato</strong> (cioè la parte dell&#8217;universo che stiamo studiando).</p>
<p>Possiamo dividere i modelli in:</p>
<ul>
<li><strong>Modello materiale</strong>: rappresentazione del <em>sistema studiato</em> ottenuto      mediante un altro sistema, di solito più semplice, ma con proprietà simili      al <em>sistema studiato</em>.</li>
<li><strong>Modello Formale</strong>: rappresenta in termini logici il <em>sistema studiato</em> in maniera semplice, con proprietà simili.</li>
</ul>
<p>I modelli materiali sono utili quando:<br />
- Vogliamo studiare un sistema di un campo inconsueto (sistema studiato), in un campo più familiare (modello meccanico)<br />
- Il modello materiale permette di svolgere esperimenti in condizioni più favorevoli rispetto a quelle date dal sistema studiato. Ad esempio ci conviene sperimentare nuovi farmaci prima sui topi, e poi sugli umani. Ma su quale base diciamo che un topo è un modello materiale dell&#8217;umano? Lo diciamo secondo alcuni criteri di &#8220;somiglianza&#8221; rispetto al modello originale.</p>
<p>I modelli non sono utili quando:<br />
- Se il modello formale non rispecchia bene il sistema studiato, anche il modello materiale sarà poco significativo.<br />
- Se il modello materiale suggerisce esperimenti predittibili dal modello formale, allora esso è superfluo.</p>
<p>Possiamo dividere i problemi in quelli a scatola chiusa e quelli a scatola aperta.<br />
Nei problemi a <strong>scatola chiusa</strong> conosciamo solo alcuni input e possiamo verificare gli output, ma non sappiamo cosa avviene dentro la scatola. <em>La legge di trasformazione è quella legge che mette in relazione l&#8217;input con l&#8217;output</em>. Per scoprire cosa c&#8217;è nella scatola possiamo provare ad aprirla ed individuare altri input e/o altri output in modo da svolgere studi più approfonditi. Man mano che apriamo tutte le scatole trovate durante lo studio, abbiamo un problema a <strong>scatola aperta</strong>.<br />
Nell&#8217;aprire le scatole, e quindi nell&#8217;aggiungere dettagli alla nostra descrizione, facciamo un&#8217;ipotesi di modularità, ipotizzando che gli input individuati siano debolmente accoppiati con gli altri elementi della scatola. Bisogna stare attenti quando si studiano questi problemi a scendere nel dettaglio fino ad un livello per noi soddisfacente, in modo da avere una buona descrizione del problema senza complicarlo in modo eccessivo.</p>
<h2>&#8220;Computer Simulation of Human Thinking&#8221; &#8211; Newell &amp; Simon</h2>
<p>Abbiamo discusso gli sviluppi della prima Cibernetica. Adesso ci spostiamo sul ramo della prima IA, ed esaminiamo il lavoro di Newell &amp; Simon.</p>
<p>Newell &amp; Simon, due neuroscienziati che studiavano la mente, avevano lo scopo di cercare dei <strong>modelli del mentale</strong>, ossia dei <strong>modelli</strong> che rappresentassero l&#8217;attività cognitiva umana.<br />
Quindi volevano costruire dei programmi che simulassero i compiti cognitivi umani in modo psicologicamente realistico.</p>
<p>Per fare ciò si costruirono delle <strong>Microteorie</strong>. Ogni microteoria era relativa ad un particolare categoria di compiti cognitivi, ad esempio giocare a dama: essi chiedevano alla persona sotto esame di giocare a dama e pensare a voce alta, quindi riferire tutti i suoi ragionamenti selettivi ed euristici (introspezione).<br />
Il programma risultante di questo studio, non solo doveva dare gli stessi risultati del ragionamento cognitivo (e quindi supera il test di Turing), ma nel calcolarli doveva elaborare le informazioni nello stesso modo di un essere umano. Quest&#8217;ultima condizione serve ad avere una simulazione psicologicamente realistica del ragionamento umano.<br />
Una volta costruito un modello per un compito cognitivo, abbiamo una microteoria. Newell &amp; Simon volevano trarre un modello della mente combinando tra loro tutte le microteorie ottenute.</p>
<p>La differenza con Turing, è che Newell &amp; Simon consideravano il test di Turing &#8220;debole&#8221; in quando non riguarda i processi del pensiero, ma prende in considerazione solo la prestazione finale.</p>
<h3>Critiche al lavoro di Newell &amp; Simon</h3>
<p><strong>Critica sull&#8217;uso del protocollo verbale</strong></p>
<p>Il protocollo verbale, con il quale i soggetti studiati illustravano il proprio processo di pensiero sono <strong>incompleti</strong> perché non tutti i processi della mente sono accessibili all&#8217;introspezione.<br />
Inoltre questo metodo di studio del mentale è scorretto perché pensare e descrivere cosa si sta pensando sono due compiti concorrenti che possono interferire tra loro.<br />
Si sta studiando il modo di pensare, o il modo in cui un essere umano descrive il proprio pensiero?</p>
<p><strong>Critica sul dominio di applicazione</strong></p>
<p>Le microteorie sono strettamente collegate al particolare problema. Quindi applicando il modello suggerito da una microteoria ad un problema simile a quello di partenza non si hanno buoni risultati.</p>
<p><strong>Critica sul campione di persone</strong></p>
<p>Il campione scelto per eseguire i test è ristretto, e non rispecchia il modo di pensare di tutta la popolazione. Inoltre ogni persona ha un modo particolare di pensare.</p>
<p><strong>Critica sulla modularità</strong></p>
<p>Newell &amp; Simon non fanno ipotesi di modularità sulla mente e la considerano interamente in un&#8217;unica architettura unificata. Successivi studi (Chomsky, Marr, Fodor, ed altri) tentano di dividere la mente in moduli, in modo da poterli studiare indipendentemente.</p>
<h3>Conclusioni</h3>
<p>Il lavoro di Newell &amp; Simon è stato fallimentare, ma il loro contributo all&#8217;IA è stato enorme. Tutt&#8217;oggi le euristiche da loro definite sono molto utilizzate.</p>
<h2>Chomsky ed il Linguaggio Universale</h2>
<p>Un esempio di ipotesi di modularità è il <strong>Linguaggio Universale</strong> di Chomsky. Lui osserva come i bambini nei loro primi anni di vita riescono ad imparare la lingua, e nota che gli stimoli che essi ricevono sono di scarsa qualità per ottenere i risultati che si hanno.<br />
Quindi l&#8217;ipotesi di modularità di Chomsky è che nella nostra mente esiste un modulo di <strong>Grammatica Universale</strong> (UG) che ci aiuta ad imparare il linguaggio parlato.</p>
<p>Quello che ha fatto Chomsky è isolare questo modulo UG dalle restanti parti della mente, e studiarlo a se stante.<br />
Questo è proprio quello che manca nel lavoro fatto da Newell &amp; Simon, in quanto non avendo fatto ipotesi di modularità, non riescono a trovare delle variabili in comune a tutti gli essere umani con le quali è possibile creare un modello di tutta la mente umana.</p>
<h2>David Marr</h2>
<p>Marr, essendo allievo di Chomsky, prende da lui spunto, e nel suo articolo &#8220;Artificial Intelligence &#8211; A Personal View&#8221; espone la sua critica al lavoro di Newell &amp; Simon.</p>
<p>Secondo Marr, un risultato nel campo dell&#8217;IA doveva seguire questi passaggi:</p>
<ol>
<li>Definizione di <strong>cosa</strong> è calcolato, e <strong>perché</strong> è calcolato</li>
<li>Definire <strong>come</strong> calcolarlo, quindi definizione di      un algoritmo</li>
<li>Dimostrazione di funzionamento</li>
</ol>
<p>Il &#8220;perché&#8221; non è interessante da definire in quanto è legato alla natura del problema: il mondo è fatto così. Il &#8220;cosa&#8221; invece è molto interessante, in quanto questo passaggio non è stato considerato da Newell &amp; Simon. Infatti è difficile definire &#8220;cosa&#8221; calcolare in modo preciso quando si sta tentando di costruire un modello per l&#8217;intera mente umana.</p>
<p>Marri chiama <em>teorie di tipo 1</em> quelle in cui si riesce a trovare una buona descrizione di cosa è calcolato, e chiama <em>teorie di tipo 2</em> quelle in cui non si è ancora riusciti a dare una descrizione formale.</p>
<h2>Antonio Damasio</h2>
<p>Molti hanno criticato Newell &amp; Simon per mancanza di ipotesi di modularità. In realtà un&#8217;ipotesi di modularità è stata fatta: l&#8217;attività di problem solving della mente umana è considerata indipendente dalle emozioni provate.</p>
<p>Damasio, neurologo e neuroscienziato degli anni 80, nello studiare un caso clinico si accorge che il paziente non è in grado di provare emozioni.<br />
Questo paziente è perfettamente in grado di effettuare ragionamenti razionali, e risponde correttamente a domande a lui poste. Però quando è coinvolto in prima persona non riesce a prendere le decisioni giuste con i suoi ragionamenti.</p>
<p>L&#8217;ipotesi di Damasio è che <em>le emozioni hanno un ruolo importante nel ragionamento pratico</em>.</p>
<p>Test effettuati con questo paziente mostrano che non è in grado di provare emozioni. Ad esempio in una partita a poker non prova tristezza se perde una mano di gioco, oppure riesce a parlare in modo freddo della sua malattia (o di eventi brutti) con freddezza.</p>
<p>Damasio va oltre questa ipotesi e ne formula un&#8217;altra, in cui afferma che, come le emozioni, <em>le immagini mentali hanno un ruolo nel ragionamento pratico</em>.</p>
<p>Supponiamo di essere stati morsi da un cane mentre passeggiavamo nel parco. Dopo qualche giorno se ripensiamo a quel cane, riusciamo ad immaginarlo e a ricostruirci nel nostro <em>buffer visivo</em> la sua immagine. Assieme alla scena ricostruita associamo un&#8217;emozione che può essere bella o brutta a seconda se il morso del cane ci è piaciuto oppure no (ovviamente in questo caso non ci è piaciuto). Quindi in futuro cercheremo di non passare vicino a quel cane perché rischiamo di essere morsi nuovamente: così facendo nel nostro ragionamento pratico elimineremo tutti gli scenari possibili che ci portano nelle vicinanze di quel cane.<br />
Damasio dice con questa ipotesi che il paziente da lui studiato è incapace associare le immagini mentali alle emozioni, e quindi nel suo ragionamento pratico può scegliere un&#8217;azione che lo riporta a commettere un errore già fatto in passato.</p>
<p>Con queste ipotesi Damasio ha cercato di spiegare l&#8217;assenza di pianificazione e di prudenza che ha il suo paziente durante i ragionamenti pratici che lo coinvolgono i prima persona.<br />
Inoltre mostra come le emozioni hanno un ruolo centrale nel ragionamento, e quindi è sbagliato considerarle indipendenti dal problem solving. Quindi sarà possibile progettare macchine con prestazioni pari a quelle degli essere umani anche se non provano emozioni?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2010/01/primi-sviluppi-intelligenza-artificiale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La nascita dell&#8217;Informatica</title>
		<link>http://www.fireteam.it/2010/01/la-nascita-dell-informatica/</link>
		<comments>http://www.fireteam.it/2010/01/la-nascita-dell-informatica/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 23:22:56 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Biblioteca]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Godel]]></category>
		<category><![CDATA[Hilbert]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Logica]]></category>
		<category><![CDATA[Turing]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=762</guid>
		<description><![CDATA[Il primo kernel Linux è stato pubblicato nel 1991, l’annuncio del primo sistema operativo della famiglia Windows risale al 1983, la nascita dell&#8217;informatica come disciplina scientifica risale al 1953, il primo calcolatore programmabile digitale al 1941 (Z3 di Zuse); in realtà tutto scaturisce da una storia molto più lunga che parte dagli studi di Leibniz [...]]]></description>
			<content:encoded><![CDATA[<p><span>Il primo<span> kernel</span> Linux è stato pubblicato nel 1991, l’annuncio del primo sistema operativo della famiglia Windows risale al 1983, la nascita dell&#8217;informatica come disciplina scientifica risale al 1953, il primo calcolatore programmabile digitale al 1941 (Z3 di <span>Zuse</span>); in realtà tutto scaturisce da una storia molto più lunga che parte dagli studi di Leibniz quando non esistevano i calcolatori digitali, e coinvolge grandi studiosi come Frege, Gödel, e <span>Turing</span>.</span></p>
<p><span><span id="more-762"></span><br />
</span></p>
<h2>Gottfried Wilhelm von Leibniz</h2>
<p>Leibniz (Lipsia, 21 giugno 1646 – Hannover, 14 novembre 1716), è stato un filosofo, matematico, e logico tedesco. Ai suoi tempi la logica era quella Aristotelica, quindi del tipo soggetto-predicato.</p>
<p>Leibniz fu il primo ad intuire l’<em style="mso-bidi-font-style: normal">elaborazione simbolica</em> con il suo progetto della <strong>Characteristica Universalis</strong>. L’idea alla base della Cu (Characteristica Universalis) era quella di creare un linguaggio universale per migliorare le comunicazioni politiche, religiose, e commerciali; quindi la Cu doveva essere un linguaggio in grado di guidare ogni sorta di ragionamento.</p>
<p>Il progetto della Cu prevedeva:</p>
<ol>
<li><!--[if !supportLists]--><span><span><span> </span></span></span>Una<strong> Lista</strong> dei concetti primitivi e simboli corrispondenti</li>
<li><!--[if !supportLists]--><span><span><span> </span></span></span><!--[endif]-->Un’<strong>Arte Combinatoria</strong> utile a combinare i concetti primitivi:
<ol>
<li><!--[if !supportLists]--><span><span><span> </span></span></span><!--[endif]--><span style="text-decoration: underline;">Ars Iudicandi</span>: procedura di decisione della verità</li>
<li><span><span><span> </span></span></span><!--[endif]--><span style="text-decoration: underline;">Ars Invenendi</span>: procedura di decisione generativa</li>
</ol>
</li>
</ol>
<p>Notiamo che l’Ars Iudicandi e l’Ars Invenendi <em>prevedevano l’introduzione nel sistema della Cu di due procedure effettive</em>, ovvero ci doveva essere un procedimento preciso (algoritmo) sia per decidere la verità di una sentenza del linguaggio (Ars Iudicandi), sia per ottenere altre verità dalle verità che già conosciamo (Ars Invenendi).</p>
<p>I concetti di <strong>Procedura Effettiva</strong> e <strong>Calcolo Simbolico</strong> sono dunque nati da quest’idea di Leibniz.</p>
<p>Purtroppo il programma di sviluppare questo linguaggio è solo un progetto di Leibniz che non è mai stato sviluppato. Abbiamo solo dei documenti e schizzi a riguardo, che saranno poi usati da Frege.</p>
<p>Qui notiamo che l’Ars Iudicandi prevede una sorta di predicato <span>dim</span>(x,y), vero quando x è (il numero di) una dimostrazione della formula (di numero) y. Quindi è quasi un esempio compiuto di <strong>Sistema Formale</strong>.</p>
<h2>Immanuel <span>Kant</span></h2>
<p><span>Kant</span> (<span>Königsberg</span>, 22 aprile 1724 – <span>Königsberg</span>, 12 febbraio 1804) è stato un filosofo tedesco. Egli scrive un’opera alla fine del ‘700 nella quale diceva: “<em>La matematica è una cosa certa, e noi dobbiamo studiare solo come arrivare a questa certezza. Inoltre ci si può chiedere: perché la matematica è certa? Qual è il suo fondamento?</em>”.</p>
<p>Frege proverà a rispondere a questa domanda.</p>
<h2>Friedrich Ludwig <span>Gottlob</span> Frege</h2>
<p>Frege (<span>Wismar</span>, 8 novembre 1848 – Bad <span>Kleinen</span>, 26 luglio 1925) è stato un matematico, logico e filosofo tedesco, padre della logica matematica moderna.</p>
<p>Frege voleva rispondere alla domanda posta da <span>Kant</span> (<em>“Perché la matematica è certa?”</em>), usando l’intuizione che aveva avuto Leibniz nella sua Characteristica Universalis.</p>
<p>Qui è introdotta la <strong>Tesi Logicista</strong> (o <strong>Programma Logicista</strong>):</p>
<p align="center">“La Matematica è riconducibile alla Logica”</p>
<p>Si afferma che la matematica è logica! Per portare avanti il Programma Logicista, Frege introduce la logica del primo e del secondo ordine come la conosciamo attualmente. Lui la chiamava <em>Ideografia</em>.<br />
Nel 1879 Frege propose l’<em style="mso-bidi-font-style: normal">Ideografia</em> un “linguaggio in formule del pensiero puro, a imitazione di quello aritmetico” in cui dice: il modo più sicuro di condurre una dimostrazione è quello puramente logico, il quale astrae dalla natura particolare delle cose e si basa soltanto sulle leggi sulle quali si fonda ogni conoscenza.</p>
<p>A supporto della Tesi Logicista, fu introdotto il primo esempio compiuto di <strong>Sistema Formale</strong>, ovvero un sistema che vincola il processo dimostrativo in modo tale che è sempre possibile riconoscere mediante un procedimento algoritmico se una qualsiasi configurazione di simboli è una dimostrazione oppure no.</p>
<p>Questo <em>sistema formale</em> prevedeva:</p>
<ol>
<li><!--[if !supportLists]--><span><span><span> </span></span></span>Insieme Finito di <strong>Assiomi Logici</strong>.</li>
<li><!--[if !supportLists]--><span><span><span> </span></span></span><!--[endif]-->Insieme Finito di <strong>Regole di Inferenza</strong> che, senza introdurre conoscenza implicita, ci permettano di dedurre gli assiomi della Matematica dall’insieme di <em>Assiomi Logici</em>.</li>
</ol>
<p>Inoltre ci sono due importanti <strong>Condizioni di Effettività</strong> che specificano un <em>Sistema Formale</em>:</p>
<ul>
<li><!--[if !supportLists]--><span><span><span> </span></span></span>L’insieme degli Assiomi Logici è <strong>Effettivamente Decidibile</strong></li>
<li><span><span><span> </span></span></span>L’insieme delle Dimostrazioni Logiche è <strong>Effettivamente Decidibile</strong></li>
</ul>
<p style="text-indent:-18.0pt;mso-list:l3 level1 lfo5">
<p>In quest’ultima richiesta si intravede qualcosa del teorema di Gödel; si chiede che il predicato <span>dim</span>(x,y) sia effettivamente decidibile!</p>
<p>Come in Leibniz, anche questa volta ci deve essere un procedimento formale (Algoritmo) che ci assicuri le condizioni di effettività. Ma questa volta le condizioni di effettività sono espressamente richieste.</p>
<p>Inoltre Leibniz e Frege hanno obiettivi diversi, il primo vuole un linguaggio universale, mentre il secondo vuole verificare la certezza della matematica (un problema più piccolo rispetto alla definizione di una lingua universale); entrambi usano la logica come strumento per raggiungere il proprio fine epistemologico.</p>
<h2>Bertrand Arthur William Russell</h2>
<p>Frege prosegue con il suo programma logicista puntando a dimostrare gli assiomi della matematica (gli assiomi di Peano) partendo solo dagli <em>assiomi logici</em>. Nel sistema formale definito da Frege si possono individuare:</p>
<ul>
<li><span><span> </span></span>Il principio di <strong>Coestensione</strong>: “data una proprietà P, esiste l’insieme y di tutti gli x che godono della proprietà P”</li>
<li><!--[if !supportLists]--><span><span> </span></span>Il principio del <strong>Terzo Escluso</strong>: almeno uno tra <em>x</em> e <span><em>not</em></span><em> x</em> deve essere vero.</li>
</ul>
<p>Russell (<span>Trellech</span>, 18 maggio 1872 – <span>Penrhyndeudraeth</span>, 2 febbraio 1970), è stato un filosofo, logico e matematico gallese. Si interessò al lavoro di Frege, e formulò il famoso Paradosso di Russell, causa della caduta del Programma Logicista.</p>
<p><span style="text-decoration: underline;">Paradosso di Russell</span>: Supponiamo la proprietà:<span><em> not</em></span><em>(x appartiene ad x)</em><br />
Un elemento che gode di questa proprietà non appartiene a se stesso. Per il principio della coestensione c’è l’insieme di tutti gli elementi che godono di questa proprietà. Quindi diciamo y l’insieme di tutti gli elementi che non appartengono a se stessi. Adesso ci chiediamo: y appartiene a se stesso?</p>
<ul>
<li><!--[if !supportLists]--><span><span> </span></span>Se y appartiene a se stesso allora gode della proprietà di non appartenere a se stesso.</li>
<li><!--[if !supportLists]--><span> </span>Se y non appartiene a se stesso allora per come è definito deve appartenere a se stesso</li>
</ul>
<p>In entrambi i casi, grazie al principio del terzo escluso, giungiamo ad una contraddizione (questa è un’<strong>antinomia</strong>).</p>
<p>Russell nel 1901 formulò il paradosso e si rese conto delle conseguenze che avrebbe avuto per il programma logicista. Non esitò a mettersi in contatto con Frege con una lettera nell&#8217;estate del 1902 in cui illustra il paradosso.</p>
<p>Frege prese atto delle conseguenze distruttive per il sistema che aveva costruito in quegli anni e decise di scrivere un&#8217;appendice ai suoi Principî in cui confessava il fallimento della sua opera.</p>
<p>Siamo davanti ad una scelta:</p>
<p class="MsoListParagraph"><!--[if !supportLists]--><span><span>-</span></span><em> rinunciare al principio del terzo escluso</em>: e quindi rinunciare alla logica classica</p>
<p>oppure</p>
<p class="MsoListParagraph"><!--[if !supportLists]--><span><span>-</span></span><em> rinunciare al principio di coestensione</em>: ma in questo caso non si riescono più a derivare gli assiomi della matematica</p>
<p>Qui il Programma Logicista, e sorge il <span style="text-decoration: underline;">problema della certezza della matematica</span>.</p>
<p>A seguire ci saranno due programmi che puntano a risolvere il problema della certezza della matematica: Il <strong>Programma Intuizionista</strong>, ed il <strong>Programma di Hilbert</strong>.</p>
<h2><span>Luitzen</span> <span>Egbertus</span> Jan <span>Brouwer</span></h2>
<p><span>Brouwer</span> (<span>Overschie</span>, 27 febbraio 1881 – <span>Blaricum</span>, 2 dicembre 1966) è stato un matematico olandese. Fondò la <strong>Scuola Intuizionista (o costruttivista)</strong>, nella quale dubitò<br />
del <em>principio del terzo escluso</em>.</p>
<p>I requisiti del Programma Intuizionista erano:</p>
<ol>
<li><span> </span><!--[endif]-->Eliminazione del Principio del Terzo Escluso su totalità infinite.</li>
<li>Interpretazione delle dimostrazioni in modo Costruttivista: cioè una dimostrazione di “esiste x tale che P(x)” deve effettivamente esibire un elemento y per il quale è vero P(y).</li>
</ol>
<p>Quindi gli intuizionisti puntano a limitare la matematica, eliminando l’uso di proposizioni ideali, come l’infinito in atto (o infinito attuale), che hanno permesso alla matematica di raggiungere ottimi risultati.</p>
<h2>David Hilbert</h2>
<p>Hilbert (<span>Königsberg</span>, 23 gennaio 1862 – <span>Gottinga</span>, 14 febbraio 1943) è stato un matematico tedesco. Rispose agli intuizionisti con il cosiddetto <strong>Programma di Hilbert</strong>.</p>
<p>Al contrario di Frege che voleva dimostrare gli assiomi matematici patendo dagli assiomi logici, Hilbert voleva formalizzare la matematica con degli assiomi e poi verificare la coerenza delle teorie matematiche formalizzate.</p>
<p>Quindi:</p>
<ol>
<li><!--[if !supportLists]--><!--[endif]-->Formalizzare tutte le teorie matematiche <em>“T”</em> con sistemi formali T</li>
<li><!--[if !supportLists]--><!--[endif]-->Dimostrare la coerenza di tali sistemi T con <span style="text-decoration: underline;">metodi matematici finitisti</span>.</li>
</ol>
<p>Si comincio con la più semplice delle teorie, ossia con l’Aritmetica Elementare. I <em>metodi matematici finitisti</em> non sono mai stati definiti da Hilbert con precisione. Di sicuro sono metodi matematici in cui vengono chiesti i requisiti intuizionisti: quindi no al terzo escluso su totalità infinite e interpretazione costruttivista delle dimostrazioni. Molti concordano che i metodi finitisti sono inclusi nell’aritmetica Primitiva Ricorsiva dove valgono gli assiomi di Peano che descrivono l’aritmetica elementare.</p>
<p>Nasce la meta-matematica, ossia la parte della matematica che consente di studiare la matematica da punti di vista generali. Stiamo cioè usando la matematica stessa per risolvere il <span style="text-decoration: underline;">problema della certezza della matematica</span>.<br />
Nella metamatematica possiamo studiare varie proprietà dei sistemi formali, ad esempio:</p>
<ul>
<li><!--[if !supportLists]--><strong>Coerenza</strong>: se T dimostra A allora non può dimostrare <span>not</span> A</li>
<li><!--[if !supportLists]--><strong>Correttezza</strong>: se T dimostra A allora A è vero nella teoria <em style="mso-bidi-font-style: normal">“T”</em></li>
<li><strong>Completezza</strong>: se A è vero nella teoria <em>“T”</em> allora T dimostra A</li>
</ul>
<p>Notiamo che la correttezza di un sistema formale T implica la sua coerenza.</p>
<p>Ricapitolando Hilbert con il suo <strong>Programma della Coerenza</strong> (che è solo una parte del <strong>Programma di Hilbert</strong>) vuole dimostrare la coerenza della matematica utilizzando la matematica stessa.</p>
<h2>Principia <span>Mathematica</span> (PM)</h2>
<p>I Principia <span>Mathematica</span>, scritti da Russell e <span>Whitehead</span> tra il 1910 e il 1913, rappresentano un’importante tentativo di formalizzare la matematica con la logica. Traggono origine dal lavoro di Frege.</p>
<p>Chiameremo PM il sistema formale formalizzato in questo lavoro.</p>
<h2>Kurt Gödel</h2>
<p>Gödel (Brno, 28 aprile 1906 – Princeton, 14 gennaio 1978) è stato un matematico, logico e filosofo statunitense di origine austro-ungarica, noto soprattutto per i suoi lavori sull&#8217;incompletezza delle teorie matematiche. Gödel è ritenuto uno dei più grandi logici di tutti i tempi insieme a Frege e Aristotele.</p>
<p>Gödel si interessa al Programma di Hilbert, e formula il suo <strong>primo teorema di incompletezza</strong>:</p>
<p style="margin-left:35.4pt"><em>Se PM è coerente, allora esiste una formula G nel linguaggio L(PM) tale che G è vera e non è dimostrabile in PM ne G ne <span>not</span> G</em></p>
<p>Ne segue come corollario il <strong>secondo teorema di incompletezza</strong>:</p>
<p style="margin-left:35.4pt"><em>Se PM è coerente, e dato che la coerenza di PM è esprimibile all’interno di PM stesso (<span>consis</span>(PM) appartiene a L(PM)) allora in PM non è dimostrabile <span>consis</span>(PM)</em></p>
<p>Il <strong>secondo teorema di incompletezza</strong> è quello che fa cadere il <strong>Programma di Hilbert</strong> poiché afferma che non possiamo dimostrare la coerenza di PM all’interno di PM stesso,<br />
cioè non possiamo dimostrare la coerenza della matematica all’interno della matematica stessa.</p>
<p>Però i teoremi di incompletezza si riferiscono al <strong>Sistema Formale</strong> PM. Per far cadere definitivamente il Programma di Hilbert bisognava generalizzare i teoremi di incompletezza a qualsiasi <strong>Sistema Formale</strong> che contiene l’aritmetica elementare.</p>
<h2>Generalizzazione dei Teoremi di Incompletezza</h2>
<p>Vogliamo generalizzare i teoremi di incompletezza in questo modo:</p>
<p><em>Per ogni sistema formale S tale che:</em></p>
<ol>
<li><!--[if !supportLists]--><em> </em><em>S contiene P (Aritmetica di Peano)</em></li>
<li><!--[if !supportLists]--><em> </em><em>S soddisfa la <strong>condizioni di effettività </strong>di Frege</em>
<ul>
<li><!--[if !supportLists]--><em> </em><em> a) L’insieme degli assiomi è effettivamente decidibile</em></li>
</ul>
<ul>
<li><!--[if !supportLists]--><em> </em><em>b) L’insieme delle dimostrazioni è effettivamente decidibile</em></li>
</ul>
</li>
<li><!--[if !supportLists]--><em></em><em> S è coerente</em></li>
</ol>
<p><em>Allora per S valgono i teoremi di incompletezza</em></p>
<p>Le ipotesi 1 e 3 sono ben precise. L’ipotesi 2.a e 2.b invece no! Infatti esse chiedono di avere due funzioni <strong>effettivamente calcolabili</strong> f(x) e g(Y) le quali ci decidano rispettivamente le formule ben formate di S e le dimostrazioni di S.</p>
<p>Questo è il punto di snodo tra i fondamenti della matematica e la nascita dell’informatica. Infatti una funzione è effettivamente calcolabile se esiste un algoritmo per essa.</p>
<p>Ma quale’è il concetto di algoritmo? Quali sono le funzioni calcolabili mediante un procedimento di calcolo (algoritmo)?</p>
<p>Tutt’ora non esiste un concetto di algoritmo preciso. La classe di tutti gli algoritmi è delineata con la tesi di <span>Church-Turing</span>, la quale essendo una tesi non può essere dimostrata.</p>
<h2>Alan <span>Mathison</span> <span>Turing</span></h2>
<p><span>Turing</span> (Londra, 23 giugno 1912 – <span>Wilmslow</span>, 7 giugno 1954) è stato un matematico, logico e <span>crittanalista</span> britannico, considerato uno dei padri dell&#8217;informatica.</p>
<p>Lavorò alla generalizzazione del teorema di Gödel, tentando di rispondere alla domanda: <em>“che cos’è una funzione parzialmente calcolabile mediante un procedimento di calcolo (algoritmo)?”</em>.</p>
<p>Church a quei tempi lavorava alla stessa domanda definendo la classe delle funzioni matematiche PRF, per poi arrivare ad un procedimento di calcolo (<span>λ-calcolo</span>).</p>
<p><span>Turing</span> invece cominciò questo lavoro cominciando a definire il procedimento di calcolo (definito dalla <strong>Macchina di <span>Turing</span></strong>), per poi arrivare alla classe di tutte le funzioni calcolabili da una <strong>Macchina di <span>Turing</span></strong>.</p>
<p>Per definire la sua Macchia di <span>Turing</span> (d’ora in poi <span>MdT</span>), <span>Turing</span> osservo il comportamento di un essere umano che calcola. Quindi individua una serie di restrizioni:</p>
<ol>
<li><!--[if !supportLists]-->L’umano effettua dei calcoli aiutandosi con un foglio. Nel caso di una macchina possiamo pensare ad un nastro potenzialmente infinito fatto di caselle contigue. In ogni casella possiamo<br />
scrivere un simbolo appartenente ad un alfabeto.</li>
<li><!--[if !supportLists]-->Limiti all’uso del nastro
<ul>
<li><!--[if !supportLists]--><span><span>a.<span> </span></span></span><!--[endif]-->Limite Percettivo: c’è un limite superiore B al numero di caselle contigue osservabili in un istante (questo implica che ci si può spostare sul nastro per vedere le prossime B caselle).</li>
<li><!--[if !supportLists]--><span><span>b.<span> </span></span></span><!--[endif]-->Limite di Memoria: l’alfabeto dei simboli scrivibili sul nastro è finito poiché l’essere umano non riesce a distinguere e ricordare<span> </span>infiniti simboli.</li>
</ul>
</li>
<li><!--[if !supportLists]-->Il comportamento dipende dallo stato mentale (stato di memoria) dell’essere umano. Questo stato mentale dipende dalle azioni fatte precedentemente. Senza indagare molto sul cervello umano, imponiamo che questi stati siano in numero finito (deciso a priori).</li>
<li><!--[if !supportLists]-->Limitiamo il comportamento dell’essere umano che calcola, senza perdita di generalità, al compimento di un’azione per volta:
<ul>
<li><!--[if !supportLists]--><span><span>a.<span> </span></span></span><!--[endif]-->Si può cambiare il contenuto solo delle caselle osservate</li>
<li><!--[if !supportLists]--><span><span>b.<span> </span></span></span><!--[endif]-->Ci si può spostare di un numero L di caselle per volta</li>
<li><!--[if !supportLists]--><span><span>c.<span> </span></span></span><!--[endif]-->Si può cambiare lo stato mentale</li>
</ul>
</li>
<li><!--[if !supportLists]-->Il calcolo è fatto in maniera Deterministica, dato lo stesso input otteniamo sempre lo stesso output</li>
</ol>
<p>Ma come imponiamo la condizione di determinismo?</p>
<p>Consideriamo tutte le possibili azioni che può fare l’essere umano durante il calcolo. Diciamo C l’insieme di tutte le possibili coppie &lt;stato mentale, configurazione dei simboli osservati&gt;. Per ogni elemento di C si può scegliere di fare un’azione a scelta contenuta nell’insieme possibili di azioni A (scrittura di un simbolo, spostamento a destra, spostamento a sinistra, cambiamento di stato mentale). Definiamo l’insieme di tutte le possibili istruzioni <span>I=CxA</span>. L’insieme delle istruzioni come definito contiene delle istruzioni che definiscono un algoritmo <strong>non deterministico</strong>, poiché a parità di stato mentale e configurazioni di simboli osservati, possiamo trovare istruzioni che effettuano azioni diverse. Poniamo qui una condizione di <strong>determinismo</strong>, chiedendo di avere come insieme di istruzioni solo un sottoinsieme di I nel quale non compaiano istruzioni che possono essere applicate nello stesso stato del calcolo.</p>
<p>Questa è l’analisi dell’essere umano che calcola.</p>
<p>Adesso definiamo una macchina che simulerà il comportamento di calcolo dell’essere umano. Questa macchina avrà delle configurazioni interne q, che corrispondono agli stati mentali dell’umano. Lavora su un nastro osservando ad ogni nastro un numero B di caselle contigue, e può spostarsi di un numero L di caselle a destra o a sinistra. Può usare i simboli dell’alfabeto per scrivere sulla porzione di nastro osservata, e può cambiare la sua configurazione interna. Questa macchina riproduce il comportamento di calcolo di un essere umano.</p>
<p>Ponendo i vincoli B=1 e L=1 abbiamo proprio la definizione di <strong>Macchina di <span>Turing</span></strong> (<span>MdT</span>). Chiamiamo classe delle funzioni <span>Turing</span> calcolabili (o <span>T-calcolabili</span>), la classe delle funzioni calcolabili con una <span>MdT</span>.</p>
<p><span>Turing</span> arriva a formulare la seguente tesi:</p>
<p align="center">“Ogni funzione calcolabile da un essere umano mediante algoritmo è una funzione <span>T-calcolabile</span>”</p>
<p>Notiamo che questa tesi è però ristretta alle funzioni calcolate da un essere umano, e non da un qualsiasi agente di calcolo (come un calcolatore). Proviamo ad estendere questa tesi in questo modo:</p>
<p align="center">“Ogni funzione calcolabile da un calcolatore mediante algoritmo è una funzione <span>T-calcolabile</span>”</p>
<p>Per arrivare alla tesi di <span>Church-Turing</span>, osserviamo che i limiti B ed L sono soggetti ai limiti della fisica: la teoria delle relatività ci vieta di oltrepassare la velocità della luce. Inoltre in una singola cella di nastro possiamo registrarci un simbolo preso da un alfabeto finito, perché assumiamo che la materia (del nastro) abbia un vincolo di atomicità, ma su questo non è ancora stata formulata alcuna teoria scientifica.</p>
<p>Considerando i limiti della fisica possiamo riscrivere la tesi ed ottenere finalmente la <strong>Tesi di <span>Church-Turing</span></strong>:</p>
<p align="center">“Ogni funzione calcolabile da un algoritmo è una funzione <span>T-calcolabile</span>”</p>
<p>Con questa tesi sono stati generalizzati i teoremi di incompletezza di Gödel, chiedendo che le funzioni f(x) e g(Y) siano <span>T-calcolabili</span>. Cade definitivamente il <strong>Programma di Hilbert</strong>,<br />
e il suo tentativo di verificare la certezza della matematica.</p>
<h2>Sviluppi futuri</h2>
<p>Quindi dal problema della matematica è nata la <span>MdT</span>, e <span>Turing</span> stesso definì la <strong>Macchina di <span>Turing</span> Universale</strong>, la quale è programmabile proprio come un moderno calcolatore digitale.</p>
<p>Da questo nasce il ramo dell’Intelligenza Artificiale (IA), e più in generale dell’Informatica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2010/01/la-nascita-dell-informatica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uso della Tecnologia ISDN</title>
		<link>http://www.fireteam.it/2010/01/uso-della-tecnologia-isdn/</link>
		<comments>http://www.fireteam.it/2010/01/uso-della-tecnologia-isdn/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 14:25:22 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Reti]]></category>
		<category><![CDATA[isdn]]></category>
		<category><![CDATA[pbx]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=755</guid>
		<description><![CDATA[Integrated Services Digital Network, o ISDN, è una rete digitale che dà supporto a molti servizi di voce e dati. La definizione tecnica dell&#8217;ISDN, che investe diverse componenti delle reti, risale alle raccomandazioni ITU-T della serie I del 1984 e comprende numerose altre pubblicazioni dello stesso ITU-T e dell&#8217;ETSI (European Telecommunications Standard Institute) fatte negli [...]]]></description>
			<content:encoded><![CDATA[<p>Integrated Services Digital Network, o ISDN, è una rete digitale che dà supporto a molti servizi di voce e dati. La definizione tecnica dell&#8217;ISDN, che investe diverse componenti delle reti, risale alle raccomandazioni ITU-T della serie I del 1984 e comprende numerose altre pubblicazioni dello stesso ITU-T e dell&#8217;ETSI (European Telecommunications Standard Institute) fatte negli anni successivi.</p>
<h2><strong>Integrated Services Digital Network &#8211; ISDN<br />
</strong></h2>
<p>ISDN è un servizio di <em>telefonia digitale</em> basato sul protocollo ISDN. Quindi con il termine ISDN ci riferiamo sia al protocollo, sia al servizio implementato dal protocollo stesso.</p>
<p>ISDN: protocollo che descrive come si svolgono le chiamate<br />
Una rete ISDN è quindi una rete digitale anche integrata nei servizi, in cui le diverse parti, il terminale, la rete di accesso, la rete di trasporto, sono realizzate per offrire gli stessi servizi. Elementi fondamentali per il supporto di tali servizi sono il protocollo di segnalazione della rete di trasporto ISUP (ITU-T Q.767) e della rete di accesso DSS1 (ITU-T Q.931), che fanno parte della pila di protocolli del sistema di segnalazione a canale comune n°7 insieme ad altri descritti nelle Racc. ITU-T serie Q. Attraverso tali protocolli vengono trasportate le informazioni che consentono l&#8217;espletamento dei diversi servizi; un esempio per tutti l&#8217;identità del chiamante, che viene trasportata dai protocolli di segnalazione dalla rete del chiamante verso la rete e il terminale del chiamato.</p>
<p><span id="more-755"></span></p>
<p>In Europa è usata la variante ISDN-DSS1 sviluppata da ETSI (European Telecomunications Standards Institute).<br />
Sull&#8217;accesso BRA ISDN sono disponibili una serie di nuovi servizi come la segnalazione del numero telefonico di chi chiama (Caller ID) e il multinumero, cioè la possibilità di avere fino ad otto numeri telefonici sullo stesso abbonamento, ciascuno assegnato ad un apparecchio diverso (es. uno per il telefono, uno per il fax, uno per il modem in ingresso&#8230;). La tecnologia digitale utilizzata da ISDN garantisce una qualità audio molto elevata, eliminando completamente la diafonia e buona parte dei disturbi presenti nella tradizionale telefonia . In Italia ISDN BRA viene fornito in modalità mononumero o multinumero: è possibile cioè richiedere fino a 7 numeri telefonici diversi oltre al numero principale. Sempre sull&#8217;accesso base (BRA), che comprende 2 canali B a 64 Kbit/sec, è possibile collegarsi ad Internet sia ad una velocità di 64 Kbit/s, pagando una semplice telefonata, sia, se il Provider utilizzato lo permette, ad una velocità di 128 Kbit/s, sostenendo però il costo di due chiamate contemporanee. Inoltre sono disponibili i servizi di avviso di chiamata, conferenza a tre, presentazione dell&#8217;identità del chiamante (Caller ID), trasferimento di chiamata e per alcuni Operatori anche il servizio di richiamata su occupato.</p>
<p>Molto diffusa in Italia un tipo particolare di NT, chiamata NT1+, che ha al suo interno anche un Terminal Adapter (TA) a/b, capace di gestire due porte analogiche, permettendo cosi&#8217; di connettere direttamente all&#8217;NT1+ apparati analogici come telefoni tradizionali o fax di gruppo 3. L&#8217;installazione della borchia ISDN deve essere richiesta al proprietario della rete.</p>
<p>Una ulteriore configurazione degli accessi è il &#8220;punto-punto&#8221; e &#8220;punto-multipunto&#8221; che in buona sostanza esprime il modo di dialogare della rete con uno o più terminali lato utente. La configurazione &#8220;punto-punto&#8221; è adottata in presenza, lato utente, di centralini (PABX)collegati sia su accesso primario che in pool di accessi base. La configurazione punto-multipunto è adottata ad esempio negli accessi base in cui sul bus isdn sono collegati dispositivi con numeri diversi (MSN) quali telefoni isdn, modem isdn, fax G4. La differenza tecnica che contraddistingue anche le due tipologie è il cosiddetto TEI, che viene utilizzato nel protocollo ISDN, per il quale una punto-punto è fisso a zero, mentre sulla punto-multipunto è variabile e deciso dalla centrale pubblica. Per capire se la tipologia e punto-punto o punto-multipunto, soprattutto nel caso di accesso base mononumero, bisogna contattare l&#8217;operatore che fornisce il servizio, non esistono veri e propri standard.</p>
<p><strong><span style="text-decoration: underline;">CALLER-ID</span>:</strong> è la funzione che ci permette di vedere il numero di chi ci chiama.</p>
<p><strong><span style="text-decoration: underline;">MULTINUMERO</span>:</strong> Possibilità di avere fino a 8 numeri su una singola linea ISDN. Ovviamente bisognerà assegnare un numero per ogni apparecchio.</p>
<p>Il collegamento ISDN più diffuso è quello base, a due canali (detto BRI):</p>
<li>1° Canale: 64 kbit/s</li>
<li>2° Canale: 64 kbit/s</li>
<li>3° Canale aggiuntivo: 16 kbit/s (usato per le segnalazioni)</li>
<p>La banda totale e&#8217; 144 kbit/s!!! Di questa banda, solo i canali da 64 kbit/s sono sfruttati per trasferire informazioni utili all&#8217;utente finale, quindi in effetti l&#8217;utente beneficia di 128 kbit/s (sempre teorici)</p>
<h2>Architettura ISDN</h2>
<h3>Alcuni termini</h3>
<ul>
<li><strong>NT (Network Terminator)</strong>: Traduce il segnale proveniente dalla centrale telefonica, mediante <em>U-BUS</em>, in segnale utilizzabile dai nostri dispositivi ISDN, su <em>S-BUS</em>. Inoltre il Network Terminator permette di attaccarci</li>
<li><strong>TA (Terminal Adapter) </strong>: Permette di allacciare vecchi dispositivi analogigi al Network Terminator, in moda da poterli riutilizzare. E&#8217; indicato per i vecchi FAX <img src='http://www.fireteam.it/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  .</li>
</ul>
<h3>Esempio NT (Network Terminator)</h3>
<p>Un Network Terminator, che prende in ingresso un U-Bus dalla linea ISDN, e caccia in output due S-Bus per allacciarci due dispositivi ISDN (ad esempio due telefono ISDN).</p>
<p>Notiamo che in S-Bus non è che un cavo ethernet, usato per ISDN&#8230; e (forse) per U-Bus si usa il doppino telefonico, o anche in questo caso un cavo ethernet.</p>
<h2>Configurazione di ISDN</h2>
<p>Una linea ISDN può avere varie configurazioni, in modo da adattarsi all&#8217;hardware con il quale deve funzionare (esempio PBX &#8211; centralino telefonico).</p>
<h3>Canali</h3>
<p>ISDN supporta due tipi di canali:</p>
<p><strong>-&gt; Canale B</strong> (Bearer): sono canali utilizzati per i dati ed hanno una banda prefissata di 64 kbit/s.</p>
<p><strong>-&gt; Canale D</strong> (Delta): sono canali usati per segnalazioni e controllo; in particolari configurazioni possono essere usati anche per i dati. La banda passante assegnata ad un canale D varia al variare del tipo di <em>Accesso ISDN</em>.</p>
<h3>Accesso ISDN</h3>
<p>Esistono due tipi di accesso ISDN:</p>
<ul>
<li><strong>Accesso BRI [Basic Rate Interface - Accesso Base]</strong>:&#8211; 2 canali B&#8211; 1 canale D a 16 kbit/s==&gt; Totale 2B+D = 144 kbit/s</li>
<li><strong>Accesso PRI T1 [Basic Rate Interface - Accesso Base]</strong>: (America, Giappone)&#8211; 23 canali B&#8211;  1 canale D a 64 kbit/s==&gt; Totale 23B+D = 1536 kbit/s</li>
<li><strong>Accesso BRI E1 [Basic Rate Interface - Accesso Base]</strong>: (Europa, Asia, Australia)&#8211; 30 canali B&#8211;  2 canale D a 64 kbit/s==&gt; Totale 30B+2D = 2048 kbit/s</li>
</ul>
<h3>Funzionamento Chiamate</h3>
<p>I canali D sono usati per <em>iniziare</em> le chiamate. Una volta che la chiamata è iniziata, ad essa è allocato un canale B&#8230; quindi per ogni chiamata deve essere disponibile un canale B (sempre di 64 kbit/s).</p>
<p>Notiamo come i canali B sono allocati sempre in modo dinamico!</p>
<h2>Considerazioni Tecniche</h2>
<p>L&#8217;evoluzione di ISDN l&#8217;ha portato ad essere adottato in anbito aziendale. Queste ultime scelgono spesso tra due opzioni di installazione: il <em>multinumero</em> e la <em>selezione passante</em>.</p>
<h3>Multinumero</h3>
<p>E&#8217; un servizio opzionale. <span class="blue-pen"> Permette di avere un massimo di 8 terminali, sullo steso S-BUS, ognuno raggiungibile direttamente dall&#8217;esterno con un suo proprio numero telefonico</span>.</p>
<ul>
<li>Possibile solo su ISDN accesso base (BRI)</li>
<li>Solo due terminali possono essere attivi contemporaneamente</li>
<li>Non chiede l&#8217;installazione di un PBX</li>
<li>Le chiamate interne sono a pagamento</li>
<li>NT (Network Terminator) deve essere configurato punto-multipunto</li>
</ul>
<h3>Selezione Passante</h3>
<p>E&#8217; un servizio opzionale. <span class="blue-pen"> Permette di raggiungere direttamente i terminali interni appoggiandoci su un PBX (centralino telefonico). Non si ha il limite di 8 terminali su ogni linea ISDN</span>.</p>
<ul>
<li>Possibile sia su linee BRI, sia su linee PRI</li>
<li>Non c&#8217;è limite al numero di terminali interni attivi contemporaneamente</li>
<li>Chiede l&#8217;instllazione di un PBX</li>
<li>Le chiamate interne NON sono a pagamento</li>
<li>NT (Network Terminator) deve essere configurato punto-punto</li>
</ul>
<h3>Considerazioni</h3>
<p>Il multinumero si adatta solo in pochi casi&#8230; spesso perche&#8217; sono richieste telefonate interne gratuite!</p>
<p><span class="blue-pen"><br />
Ad esempio possiamo avere cinque ingressi ISDN: ipotizziamo i numeri telefonici da 02160291<span style="text-decoration: underline;">01</span> a 02160291<span style="text-decoration: underline;">05</span> (Le ultime due cifre individuano la linea fisica, e sono 5 BRI &#8211; quindi max 10 telefonate esterne contemporaneamente).<br />
Grazie alla selezione passante riusciamo ad avere i numeri da 02160291<span style="text-decoration: underline;">00</span> a 02160291<span style="text-decoration: underline;">99</span>&#8230; un range di ben 100 numero!<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2010/01/uso-della-tecnologia-isdn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementazione della funzione di Ackermann</title>
		<link>http://www.fireteam.it/2009/11/implementazione-della-funzione-di-ackermann/</link>
		<comments>http://www.fireteam.it/2009/11/implementazione-della-funzione-di-ackermann/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 15:55:55 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Programmazione Java]]></category>
		<category><![CDATA[ackermann]]></category>
		<category><![CDATA[calcolabilità]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=734</guid>
		<description><![CDATA[La funzione di Ackermann è una funzione f(x,y,z) che ha come dominio l&#8217;insieme delle terne di numeri naturali e come codominio i numeri naturali.

Essa è un esempio di funzione ricorsiva che non è primitiva ricorsiva poiché cresce più velocemente di qualsiasi funzione ricorsiva primitiva.
Qui il codice java che implementa questa funzione:

Ackermann.java

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Ackermann &#123;
 
 static long [...]]]></description>
			<content:encoded><![CDATA[<p>La funzione di Ackermann è una funzione f(x,y,z) che ha come dominio l&#8217;insieme delle terne di numeri naturali e come codominio i numeri naturali.</p>
<p style="text-align: center;"><img class="size-full wp-image-736 aligncenter" title="ackermann" src="http://www.fireteam.it/wp-content/uploads/2009/11/ackermann.png" alt="ackermann" width="477" height="87" /></p>
<p>Essa è un esempio di funzione ricorsiva che non è primitiva ricorsiva poiché cresce più velocemente di qualsiasi funzione ricorsiva primitiva.</p>
<p>Qui il codice java che implementa questa funzione:</p>
<p><span id="more-734"></span></p>
<p><span style="text-decoration: underline;">Ackermann.java</span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Ackermann <span style="color: #009900;">&#123;</span>
 
 <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">long</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
 
 <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">long</span> h<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">long</span> m, <span style="color: #000066; font-weight: bold;">long</span> n<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  
  count<span style="color: #339933;">++;</span>
  
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>m <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">return</span> n <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">return</span> h<span style="color: #009900;">&#40;</span>m<span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  
  <span style="color: #000000; font-weight: bold;">return</span> h<span style="color: #009900;">&#40;</span>m<span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span>, h<span style="color: #009900;">&#40;</span>m,n<span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
 
 <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">long</span> ack<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">long</span> n<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">return</span> h<span style="color: #009900;">&#40;</span>n, n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>args.<span style="color: #006633;">length</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;usage: Ackermann &lt;number&gt;<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>where number is a positive integer&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  
  <span style="color: #000066; font-weight: bold;">long</span> n <span style="color: #339933;">=</span> <span style="color: #003399;">Long</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  
  count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">long</span> retValue <span style="color: #339933;">=</span> ack<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
  <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ack(&quot;</span> <span style="color: #339933;">+</span> n <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;) = &quot;</span> <span style="color: #339933;">+</span> retValue <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; [recursive calls = &quot;</span><span style="color: #339933;">+</span> count <span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  
  <span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Il meccanismo di calcolo della funzione è estremamente semplice quanto pesante dal punto di vista computazionale. Questi sono i risultati ottenuti:</p>
<ul>
<li>ack(0) = <strong>1</strong>  [recursive calls = <strong>1</strong>]</li>
<li>ack(1) = <strong>3</strong>  [recursive calls = <strong>4</strong>]</li>
<li>ack(2) = <strong>7</strong>  [recursive calls = <strong>27</strong>]</li>
<li>ack(3) = <strong>61</strong> [recursive calls = <strong>2432</strong>]</li>
</ul>
<p>Non riesco a calcolare ack(4) causa stack overflow (Exception in thread &#8220;main&#8221; java.lang.StackOverflowError).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2009/11/implementazione-della-funzione-di-ackermann/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Utilizzare un Weblog Client con Wordpress</title>
		<link>http://www.fireteam.it/2009/10/utilizzare-un-weblog-client-con-wordpress/</link>
		<comments>http://www.fireteam.it/2009/10/utilizzare-un-weblog-client-con-wordpress/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 08:56:20 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[blog client]]></category>
		<category><![CDATA[weblog client]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=694</guid>
		<description><![CDATA[Il software per Weblog (anche chiamato blog software o blogware) è del software creato per semplificare la creazione e la manutenzione di blog (detti formalmente weblog).Come CMS (content management system) specializzati, i blog hanno tutti caratteristiche in comune come il suppoto per gli autori, per l&#8217;editing e la pubblicazione dei post (in italiano: articoli), gestione [...]]]></description>
			<content:encoded><![CDATA[<p>Il software per Weblog (anche chiamato blog software o blogware) è del software creato per semplificare la creazione e la manutenzione di blog (detti formalmente weblog).Come CMS (content management system) specializzati, i blog hanno tutti caratteristiche in comune come il suppoto per gli autori, per l&#8217;editing e la pubblicazione dei post (in italiano: articoli), gestione dei commenti e la loro moderazione, ed altre operazioni.</p>
<p>La manutenzione di un blog attraverso internet è una caratteristica comune di tutti i blog. Questa è fatta attraverso una interfaccia web-based, cioè la famosa parte di amministrazione.<br />
Molti blog supportano l&#8217;uso di software esterno (client per la gestione del blog), detto Weblog Client, per la gestione dei contenuti attraverso l&#8217;uso di API come le MetaWeblog API e le Atom Publishing Protocol.</p>
<p><span id="more-694"></span></p>
<p>Per Wordpress abbiamo una lunga lista di Weblog Client, ma prima di sceglierne uno bisogna abilitare il protocollo Atom Publishing oppure XML-RPC. Questo di fa spuntando la relativa opzione nelle impostazioni di scrittura di Wordpress.<br />
Fatto questo dobbiamo scegliere un software tra wuelli disponibili per il nostro sistema operativo. Questi sono i software che ho individuato:</p>
<h3>Linux</h3>
<p style="padding-left: 30px;">* BloGTK<br />
* Drivel<br />
* Flock<br />
* Gnome Blog<br />
* JBlogEditor<br />
* QTM<br />
* ScribeFire<br />
* WriteToMyBlog – web based</p>
<h3>Windows</h3>
</p>
<p style="padding-left: 30px;">* BlogDesk<br />
* BlogJet<br />
* Blog Writer<br />
* Chrysanth WebStory<br />
* Deepest Sender<br />
* Ecto<br />
* Elicit<br />
* Flock<br />
* JBlogEditor<br />
* LIPIDr Blog Client<br />
* Post2Blog<br />
* Post2Blog Express<br />
* Qumana<br />
* ScribeFire<br />
* Semagic<br />
* Zoundry Raven<br />
* w.bloggar<br />
* WB Editor<br />
* Windows Live Writer<br />
* WriteToMyBlog – web based</p>
<h3>Mac OS X:</h3>
</p>
<p style="padding-left: 30px;">* Ecto<br />
* Flock<br />
* JBlogEditor<br />
* Journler (however blogging is being dropped soon from Journler)<br />
* MacJournal<br />
* MarsEdit<br />
* QTM<br />
* Qumana<br />
* ScribeFire (formerly Performancing)<br />
* TextMate<br />
* WriteToMyBlog – web based</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2009/10/utilizzare-un-weblog-client-con-wordpress/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Descrivere i media con Mpeg-7</title>
		<link>http://www.fireteam.it/2009/09/descrivere-i-media-con-mpeg-7/</link>
		<comments>http://www.fireteam.it/2009/09/descrivere-i-media-con-mpeg-7/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 12:34:35 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Mpeg-7]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=705</guid>
		<description><![CDATA[La diffusione delle connessioni a banda larga ha agevolato la diffusione di audio e video via web: un esempio eclatante è YouTube! Ma riuscire a trovare un video particolare tra la grossa quantità di dati multimediali sul web è un compito arduo: il valore del dato multimediale dipende da quanto è agevole trovarlo, gestirlo, ed [...]]]></description>
			<content:encoded><![CDATA[<p class="western">La diffusione delle connessioni a banda larga ha agevolato la diffusione di audio e video via web: un esempio eclatante è YouTube! Ma riuscire a trovare un video particolare tra la grossa quantità di dati multimediali sul web è un compito arduo: il valore del dato multimediale dipende da quanto è agevole trovarlo, gestirlo, ed accedere.</p>
<p style="margin-bottom: 0cm">Per gestire questa grossa quantità di dati multimediali, sia da parte degli utenti, sia da parte dei sistemi automatici, ci aiuta Mpeg-7: uno standard nato per codificare i contenuti multimediali attraverso la definizione di metadati sui dati multimediali.</p>
<p style="margin-bottom: 0cm">I precedenti standard Mpeg-1 (1992), Mpeg-2 (1994), e Mpeg-4 (1999) riguardano la codifica del video. Nel 2001 è stato definito Mpeg-7 che non definisce il modo di codificare un video, ma riguarda la sua metataggatura attraverso un linguaggio XML.<br />
Perché 7? Mpeg-7 permette di definire metadati sui video codificati con Mpeg 1, 2, e 4. Siccome 4+2+1=7, nasce il nome Mpeg-7.
</p>
<p style="margin-bottom: 0cm"><span id="more-705"></span></p>
<p style="margin-bottom: 0cm">Notiamo come non è stato nominato Mpeg-3, lo standard per i famosissimi mp3 <img src='http://www.fireteam.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . In realtà questo standard non esiste, ma il nome Mpeg-3 è usato per riferirsi alla parte audio di Mpeg-2.</p>
<h2 class="western">Metadati</h2>
<p style="margin-bottom: 0cm">I metadati associati ad un video permettono di descrivere cosa c&#8217;è nel video. Mpeg-7 permette descrizioni sia a basso livello (caratteristiche del segnale, come il colore di un oggetto), sia ad alto livello (informazioni semantiche, come la scena di un goal in una partita di calcio).<br />
Un esempio di file XML in formato Mpeg-7 contenente la descrizione di un video di una notizia è:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> <span style="color: #000066;">standalone</span>=<span style="color: #ff0000;">&quot;no&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
 <span style="color: #808080; font-style: italic;">&lt;!--Metadati generati automaticamente dall'applicazione--&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Mpeg7</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:schema:2001&quot;</span> <span style="color: #000066;">xmlns:mpeg7</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:schema:2001&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:schema:2001 Mpeg7-2001.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Description</span> <span style="color: #000066;">xsi:type</span>=<span style="color: #ff0000;">&quot;ContentEntityType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MultimediaContent</span> <span style="color: #000066;">xsi:type</span>=<span style="color: #ff0000;">&quot;VideoType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Video<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaProfile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaFormat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Content</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;MPEG7ContentCS&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;FileFormat</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:cs:FileFormatCS:2001:3&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>mpeg<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/FileFormat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;FileSize<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>17333073<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/FileSize<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;VisualCoding<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Format</span> <span style="color: #000066;">colorDomain</span>=<span style="color: #ff0000;">&quot;color&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:cs:VisualCodingFormatCS:2001:1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Frame</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;576&quot;</span> <span style="color: #000066;">rate</span>=<span style="color: #ff0000;">&quot;8000&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;720&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/VisualCoding<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaFormat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaInstance</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;v20090201_video_15213221&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;InstanceIdentifier</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090201_video_15213221.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaInstance<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaProfile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CreationInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Creation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Obama: presto un piano per famiglie Usa per tagliare costi
 mutui<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Abstract<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;FreeTextAnnotation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 Presidente cerca arginare effetti devastante crisi economica
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/FreeTextAnnotation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;StructuredAnnotation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;When<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1 Feb 2009<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/When<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/StructuredAnnotation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Abstract<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Creator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Role</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:cs:RoleCS:2001:producer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Red<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Role<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Agent</span> <span style="color: #000066;">xsi:type</span>=<span style="color: #ff0000;">&quot;OrganizationType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Apcom<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Agent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Creator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CreationCoordinates<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Location<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>milano<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Location<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Date<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;TimePoint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2009-02-01T15:21:32<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/TimePoint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Date<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CreationCoordinates<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CopyrightString<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>TMNews<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CopyrightString<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Creation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Classification<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Genre</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:TVAnytime_v0.1ContentCS:3.14&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>est<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Genre<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaReview<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Rating<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RatingValue<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>0.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RatingValue<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RatingScheme</span> <span style="color: #000066;">best</span>=<span style="color: #ff0000;">&quot;5&quot;</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;higherBetter&quot;</span> <span style="color: #000066;">worst</span>=<span style="color: #ff0000;">&quot;0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Overall<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RatingScheme<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Rating<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaReview<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Classification<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090201_video_17483840.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090201_video_18024720.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090201_video_18094945.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090201_video_18153193.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090202_video_13033231.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090202_video_13094131.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090202_video_16491593.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090202_video_17042673.mov<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/RelatedMaterial<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CreationInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;UsageInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Availability</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;onDemand&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;InstanceRef</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;MPEG7PublicationTypeCS:4&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Dissemination<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Format</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;MPEG7PublicationTypeCS:4&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Internet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Format<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Location<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Region<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>it<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Region<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Location<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Dissemination<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Availability<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;UsageRecord<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;AvailabilityRef</span> <span style="color: #000066;">idref</span>=<span style="color: #ff0000;">&quot;onDemand&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Audience<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Audience<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/UsageRecord<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/UsageInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaTime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaTimePoint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>T00:00:00<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaTimePoint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaDuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>PT0H0M29S<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaDuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaTime<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Video<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MultimediaContent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MultimediaContent</span> <span style="color: #000066;">xsi:type</span>=<span style="color: #ff0000;">&quot;ImageType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Image<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaProfile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaFormat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Content</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:cs:ContentCS:2001:2&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>visual<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Content<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;FileFormat</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:cs:FileFormatCS:2001:3&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>JPEG2000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/FileFormat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;FileSize<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>12014<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/FileSize<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;VisualCoding<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Format</span> <span style="color: #000066;">colorDomain</span>=<span style="color: #ff0000;">&quot;binary&quot;</span></span>
<span style="color: #009900;"> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:cs:VisualCodingFormatCS:2001:1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>JPEG2000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Format<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Frame</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;288&quot;</span> <span style="color: #000066;">rate</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;360&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/VisualCoding<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaFormat<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaInstance</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;i20090201_video_15213221&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;InstanceIdentifier</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20090201_video_15213221.jpg<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaUri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaLocator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaInstance<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaProfile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MediaInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CreationInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Creation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 Foto
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Creator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Role</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;urn:mpeg:mpeg7:cs:RoleCS:AUTHOR&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Red<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Role<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Agent</span> <span style="color: #000066;">xsi:type</span>=<span style="color: #ff0000;">&quot;OrganizationType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>MPEG<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Agent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Creator<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Creation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CreationInformation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Image<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/MultimediaContent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Mpeg7<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

</p>
<p style="margin-bottom: 0cm">Mpeg-7 è un linguaggio XML, ossia usa XML per definire i metadati. In realtà un file Mpeg-7 non è altro che un file &#8216;.xml&#8217; associato ad uno o più oggetti multimediali. Quindi è possibile memorizzare i metadati indipendentemente dai video&#8230; ad esempio un possibile uso di Mpeg-7, è la costruzione di un database multimediale!</p>
<h2 class="western">Componenti di Mpeg-7</h2>
<p style="margin-bottom: 0cm">Lo standard Mpeg-7 è composta da quattro elementi fondamentali:</p>
<ul>
<li>
<p style="margin-bottom: 0cm">Description Tools</p>
</li>
<li>
<p style="margin-bottom: 0cm">Descriptor</p>
</li>
<li>
<p style="margin-bottom: 0cm">Description Scheme</p>
</li>
<li>
<p style="margin-bottom: 0cm">DDL – Description Definition<br />
Language</p>
</li>
<li>
<p style="margin-bottom: 0cm">System Tool</p>
</li>
</ul>
<p style="margin-bottom: 0cm">I metadati di un oggetto multimediale saranno descritti usando i &#8216;Description Tools&#8217;.<br />
I &#8216;Description Tools&#8217; a loro volta fanno uso del &#8216;Description Definition Language&#8217; (DDL) che è una estensione di XML Schema proprio per Mpeg-7.<br />
I &#8216;System Tool&#8217; non riguardano la definizione di metadati, ma la loro rappresentazione e trasmissione. Quindi il file XML è prodotto utilizzando solo &#8216;Description Tools&#8217; e &#8216;DDL&#8217;, e poi questo file XML può essere diffuso utilizzando le tecniche dei &#8216;System Tools&#8217;.</p>
<h3 class="western">Description Definition Language (DDL)</h3>
</p>
<p style="margin-bottom: 0cm">Il DDL è basato su XML Schema Language e ne rappresenta una sorta di estensione orientata al multimedia. In particolare XML Schema non è stato progettato per le descrizioni di contenuti audio/video e necessita quindi di tipi di dato per array e matrici, e tipo di dato per gestire il tempo (BasicTimePoint e BasicDuration).</p>
<p style="margin-bottom: 0cm">Ad esempio la definizione di TimeType è:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Definition of Time datatype --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;complexType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;TimeType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sequence<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;choice<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;TimePoint&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;mpeg7:TimePointType&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;RelTimePoint&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;mpeg7:RelTimePointType&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;RelIncrTimePoint&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;mpeg7:RelIncrTimePointType&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/choice<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;choice</span> <span style="color: #000066;">minOccurs</span>=<span style="color: #ff0000;">&quot;0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Duration&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;mpeg7:durationType&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;IncrDuration&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;mpeg7:IncrDurationType&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/choice<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/sequence<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/complexType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #808080; font-style: italic;">&lt;!-- Definition of TimePoint datatype --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;simpleType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;TimePointType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;restriction</span> <span style="color: #000066;">base</span>=<span style="color: #ff0000;">&quot;mpeg7:basicTimePointType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pattern</span></span>
<span style="color: #009900;"> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;(\-?\d+(\-\d{2}(\-\d{2})?)?)?(T\d{2}(:\d{2}(:\d{2} (:\d+)?)?)?)?(F\d+)?(\-|\+\d{2}:\d{2})?&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/restriction<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/simpleType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #808080; font-style: italic;">&lt;!-- Definition of duration datatype --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;simpleType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;durationType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;restriction</span> <span style="color: #000066;">base</span>=<span style="color: #ff0000;">&quot;mpeg7:basicDurationType&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pattern</span></span>
<span style="color: #009900;"> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;\-?P(\d+D)?(T(\d+H)?(\d+M)</span>
<span style="color: #009900;"> ?(\d+S)?(\d+N)?)?( \d+F)?((\-|\+)\d{2}:\d{2}Z)?&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/restriction<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/simpleType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p style="margin-bottom: 0cm">Usando queste definizioni di tipo contenute nella DDL, siamo in grado di descrivere il fatto che un certo filmato rappresenta un evento iniziato il 16 ottobre 2002 alle ore 17:00 in un paese con GTM+1, e dura 10 giorni, con questo codice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Time<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;TimePoint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2002-10-16T17:00+01:00<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/TimePoint<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Duration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>P10D<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Duration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Time<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p style="margin-bottom: 0cm">Ovviamente il DDL, oltre ai tipi qui introdotti (TimeType, TimePointType, e durationType), contiene molte altre definizioni che per brevità non tratteremo.</p>
<h3 class="western">Description Tools</h3>
<p style="margin-bottom: 0cm">I Description Tools comprendono &#8216;Descriptor&#8217; e &#8216;Descriptor Schemes&#8217; che preferisco non distinguere e trattarli insieme, raggruppandoli in base alle loro funzionalità:</p>
<ul>
<li>
<p style="margin-bottom: 0cm"><strong>Schema and Basic Elements</strong>:<br />
forniscono tutti i tipi di dato utilizzati nelle descrizioni, e la<br />
loro corrispondenza con i tag utilizzati in Mpeg-7;</p>
</li>
<li>
<p style="margin-bottom: 0cm"><strong>Content Description</strong>:<br />
rappresentazione dell&#8217;informazione audio/video sia a livello<br />
strutturale (basso livello), sia a livello semantico (alto livello);</p>
</li>
<li>
<p style="margin-bottom: 0cm"><strong>Content Management</strong>:<br />
permette di descrivere caratteristiche come creazione, formato, ed<br />
uso del materiale multimediale;</p>
</li>
<li>
<p style="margin-bottom: 0cm"><strong>Content Organization</strong>:<br />
Permette di gestire collezioni di materiale multimediale: si possono<br />
usare questi tool per implementare una base di dati XML di<br />
informazioni su materiale multimediale;</p>
</li>
<li>
<p style="margin-bottom: 0cm"><strong>Navigation and Access</strong>:<br />
aiutano l&#8217;accessibilità al file multimediale;</p>
</li>
<li>
<p style="margin-bottom: 0cm"><strong>User Interaction</strong>:<br />
permettono di memorizzare le preferenze dell&#8217;utente.</p>
</li>
</ul>
<p>Con i Description Tools siamo in grado di produrre due tipi di descrizioni Mpeg-7 valide: le &#8220;Complete Descriptions&#8221; che descrivono interamente un materiale multimediale come un video (l&#8217;esempio di file xml Mpeg-7 di questo articolo corrisponde ad una Complete Description perchè descrive completamente il video), e le &#8220;Descriptions Units&#8221; che non sono descrizioni intere ma dei componenti che possono far parte di una Complete Description.</p>
<h2 class="western">Conclusioni</h2>
<p style="margin-bottom: 0cm">Non si è trattata la parte dei System Tools, inoltre della parte dei Description Tool si è data una semplice descrizione generale. I Description Tool sono la parte più corposa dello standard Mpeg-7, e studiarli tutti può richiedere tempo. Si suggerisce a tal proposito di utilizzare i documenti ufficiali dello standard o l&#8217;utilissima guida di Chiariglione all&#8217;indirizzo http://www.chiariglione.org/mpeg/ .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2009/09/descrivere-i-media-con-mpeg-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduzione alla Tecnologia XML</title>
		<link>http://www.fireteam.it/2009/09/introduzione-alla-tecnologia-xml/</link>
		<comments>http://www.fireteam.it/2009/09/introduzione-alla-tecnologia-xml/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 15:16:49 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Database XML]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/2009/09/introduzione-alla-tecnologia-xml/</guid>
		<description><![CDATA[Il linguaggio XML è diventato uno degli elementi fondamentali per la realizzazione di sistemi informativi, indipendentemente dalla tecnologia usata.
Storia
Il World Wide Web Consortium (W3C), in seguito alla guerra dei browser fu costretto a seguire le individuali estensioni al linguaggio HTML. Dovette scegliere quali caratteristiche standardizzare e quali lasciare fuori dalle specifiche ufficiali dell&#8217;HTML. Fu in [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_700" class="wp-caption alignleft" style="width: 268px"><a href="http://www.fireteam.it/wp-content/uploads/2009/09/xquery.png"><img class="size-full wp-image-700" title="xquery" src="http://www.fireteam.it/wp-content/uploads/2009/09/xquery.png" alt="Relazione tra XQuery ed XPath" width="258" height="169" /></a><p class="wp-caption-text">Relazione tra XQuery ed XPath</p></div>
<p>Il linguaggio XML è diventato uno degli elementi fondamentali per la realizzazione di sistemi informativi, indipendentemente dalla tecnologia usata.</p>
<h2>Storia</h2>
<p>Il World Wide Web Consortium (W3C), in seguito alla guerra dei browser fu costretto a seguire le individuali estensioni al linguaggio HTML. Dovette scegliere quali caratteristiche standardizzare e quali lasciare fuori dalle specifiche ufficiali dell&#8217;HTML. Fu in questo contesto che iniziò a delinearsi la necessità di un linguaggio di markup che desse maggiore libertà nella definizione dei tag, pur rimanendo in uno standard.</p>
<p>Il &#8220;progetto XML&#8221;, che ebbe inizio alla fine degli anni &#8216;80 nell&#8217;ambito della SGML Activity del W3C, suscitò un così forte interesse a tal punto che la W3C creò un gruppo di lavoro, chiamato XML Working Group, composto da esperti mondiali delle tecnologie SGML, ed una commissione, XML Editorial Review Board, deputata alla redazione delle specifiche del progetto.</p>
<p>Nel febbraio del 1998 le specifiche divennero una raccomandazione ufficiale con il nome di Extensible Mark-up Language, versione 1.0. Ben presto ci si accorse che XML non era solo limitato al contesto web, ma era qualcosa di più: uno strumento che permetteva di essere utilizzato nei più diversi contesti, dalla definizione della struttura di documenti, allo scambio delle informazioni tra sistemi diversi, dalla rappresentazione di immagini alla definizione di formati di dati.</p>
<p><span id="more-696"></span></p>
<h2>Il Linguaggio</h2>
<ul>
<li><strong>Definizione XML</strong>: (acronimo di eXtensible Markup Language) è un metalinguaggio di markup, ovvero un linguaggio marcatore che definisce un meccanismo sintattico che consente di estendere o controllare il significato di altri linguaggi marcatori. Costituisce il tentativo di produrre una versione semplificata di SGML che consenta di definire in modo semplice nuovi linguaggi di markup</li>
</ul>
<p>Quindi quello che si fa con XML è definire/progettare dei propri “Linguaggi XML” (cioè un linguaggio basato su XML); ad esempio possiamo scegliere di codificare in XML i risultati di una giornata del campionato di calcio:</p>
<p><!--more--></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;partite</span> <span style="color: #000066;">giornata</span>=”3°”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;partita</span> <span style="color: #000066;">numero</span>=”1”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Napoli<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Juventus<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;risultato<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>3-0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/risultato<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/partita<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;partita</span> <span style="color: #000066;">numero</span>=”2”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Roma<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Lazio<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/squadra<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;risultato<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2-2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/risultato<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/partita<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/partite<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Il processo di sviluppo di un linguaggio XML è detto “XMLificazione”: ossia la scelta dei tag (partite, partita, squadra, risultato), degli attributi (giornata, numero), e della loro struttura.</p>
<p>Ci possono essere però altri linguaggi XML che usano i nostri stessi tag, e mischiare più linguaggi XML con nomi dei tag uguali può portare a confusione, per questo possiamo introdurre un namespace per i nostri nomi.</p>
<ul>
<li><strong>Namespace XML</strong>: Un namespace è una collezione di nomi di entità, definite dal programmatore, omogeneamente usate in uno o più file sorgente. Lo scopo dei namespace è quello di evitare confusione ed equivoci nel caso siano necessarie molte entità con nomi simili, fornendo il modo di raggruppare i nomi per categorie.Nel linguaggio XML i namespaces sono definiti esplicitamente.</li>
</ul>
<p>Nel nostro caso la prima riga diventerà:</p>
<p>&lt;partite giornata=”3°” xmlns=”http://www.fireteam.it”&gt;</p>
<p>In questo modo indichiamo che il tag &#8216;partite&#8217; e tutto il suo contenuto appartengono al namespace &#8216;http://www.fireteam.it&#8217; di default.</p>
<p>Fin qui XML sembra la più banale delle tecnologie, eppure ha avuto così tanto successo&#8230; allora perché è così importante?</p>
<h2>La Tecnologia XML</h2>
<p>Il primo motivo è che tutti i file XML sono codificati in UNICODE (i famosi UTF-8 UTF-16, ed UTF-32), e sono stati eliminati in questo modo molto dei fastidi che affligevano i formati testuali.</p>
<p>Il secondo motivo è che con XML si può rappresentare l&#8217;informazione in modo semplice, mantenendo un minimo di struttura; non a caso l&#8217;informazione codificata in XML è detta semistrutturata, che è il compromesso dalla completa strutturazione (come ad esempio la struttura rigida di uno schema di un database relazionale) e l&#8217;assenza di struttura (schema-less, ossia il testo puro).</p>
<p>Il terzo motivo, che ritengo più importante, è che attorno a questo semplice linguaggio di markup sono state definite parecchie tecnologie utili a risparmiare lavoro durante il trattamento dei dati. Queste sono:</p>
<ul>
<li><strong>Xpath</strong>: è un linguaggio parte della famiglia XML che permette di individuare i nodi all&#8217;interno di un documento XML.</li>
</ul>
<ul>
<li><strong>Linguaggi Schema</strong>: un linguaggio di schema è un linguaggio formale per esprimere “schemi”. Uno schema è la definizione formale della sintassi di un linguaggio XML, ovvero una famiglia di documenti XML.
<ul>
<li><strong>DTD</strong>: Il linguaggio DTD è utile a definire schemi DTD per un particolare linguaggio XML. DTD è semplice, con un potere espressivo limitato, non è autoesplicativo poiché non usa una notazione XML (è descritto da una grammatica BNF), e tra i tanti difetti non supporta i namespace in quanto il linguaggio DTD stato definito è stato definito prima dei namespace.</li>
<li><strong>Schema</strong>: è un linguaggio di schema nato per sostituire DTD. E&#8217; più espressivo, è quasi autoesplicativo (è scritto in XML e la sua sintassi è definibile con XML schema stesso, ma non si riescono a catturare tutti gli aspetti sintattici del linguaggio). Inoltre introduce i tipi di dato e permette di crearne nuovi, in modo da riuscire a fare buoni controlli sui contenuti dei file XML.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>XSL</strong>: acronimo di eXtensible Stylesheet Language, è il linguaggio di descrizione dei fogli di stile per i documenti in formato XML. Com&#8217;è noto, lo standard XML prevede che i contenuti di un documento siano separati dalla formattazione della pagina in cui verranno pubblicati.
<ul>
<li><strong>XSLT</strong>: XSL Transformations &#8211; il linguaggio di trasformazione dell&#8217;XML. Fa uso di XPath per accedere alle parti di un documento XML. La trasformazione è fatta da un modulo detto Processore XSLT, come ad esempio quello incluso nei browser.</li>
<li><strong>XSL-FO</strong>: XSL Formatting Objects &#8211; usato per l&#8217;applicazione degli stili e del modo di apparizione a un documento XML.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>XQuery</strong>: abbrevazione per XML Query Language, è un linguaggio di programmazione specificato dal W3C e destinato ad interrogare documenti e basi di dati XML.</li>
</ul>
<p>Qui è d&#8217;obbligo soffermarsi per discutere sull&#8217;utilità di un linguaggio di interrogazione XML. Un&#8217;ambiziosa applicazione di XML ha come scopo la generalizzazione del tradizionale modello delle basi di dati relazionali. Da tempo si sta cercando un&#8217;alternativa ai vecchissimi database relazionali, e si è provato in svariate direzioni&#8230; database gerarchici, database multidimensionali, database ad oggetti, ecc.</p>
<p>XML è un alternativa allettane! Oggi si scrive molto in XML, specialmente sul web dove vi sono pagine XHTML (che sono XML), e l&#8217;idea di avere un database XML perfettamente integrabile con tutti gli altri nostri dati non è affatto male&#8230; il World Wide Web può così diventare una gigantesca base di dati.</p>
<p>XQuery è un linguaggio per interrogare file XML, allo stesso modo in cui SQL interroga base di dati relazionali&#8230; ed è qui che una collezione di file XML è spesso chiamata Database XML.</p>
<p>E come tutti i linguaggi di interrogazione che si rispettano anche per XQuery c&#8217;è un algebra&#8230; XML Query Algebra definita dal W3C. In realtà i lavori sono ancora in progresso e ci sono varie proposte di algebra:</p>
<ul>
<li><strong>Algebra per linguaggi di interrogazione XML</strong>: sono stati proposti svariati linguaggi di interrogazione XML, come XQuery, XML-QL, ed altri; quindi c&#8217;è un interesse crescente verso l&#8217;interrogazione di file XML. Non ancora però è stata definita un&#8217;algebra comune per questi linguaggi. Un algebra formale è un passo obbligato per avere una buona ottimizzazione delle query.
<ul>
<li><strong>TAX</strong>: E&#8217; una proposta di algebra non standard, utilizzata da un motore di database XML chiamato “Timber XML”. TAX sta per “Tree Algebra for XML”, ed è una proposta interessante perché usa un modello di dati dove i documenti XML sono effettivamente visti come alberi, quindi le varie operazioni (Selezione, Proiezione, Prodotto, Set, Raggruppamento, Aggregazione, Renaming, Reordering, Copy-and-Paste, Cancellazione, Inserimento) risultano definite in modo naturale.</li>
<li><strong>XML Query Algebra</strong>: anche chiamata “The Algebra” è la proposta di standardizzazione da parte del W3C. Questa algebra, che sembra assomigliare ad un linguaggio di programmazione dichiarativo, non definisce le operazioni con operatori ad HOC, ma riesce a ricavare le consuete operazioni mediante l&#8217;uso di cicli for, assegnazioni di variabili, costrutti condizionali, ed altro. Inoltre i tipi di dato sono molto importanti, e sono definiti per ogni espressione. Una volta tradotta una query, la sua ottimizzazione sfrutta delle regole di inferenza logica; un metodo del tutto innovativo.</li>
</ul>
</li>
</ul>
<p>E quando queste tecnologie non riescono a soddisfare le nostre richieste, entra in gioco la solita programmazione:</p>
<ul>
<li><strong>Programmazione XML</strong>: Benchè gli strumenti XML (Schema, XSLT, XQuery, XPath, ecc&#8230;) ci permettono di fare molti tipi di elaborazione, spesso c&#8217;è la necessita di manipolare file XML da linguaggi di programmazione di uso generale come ad esempio Java.
<ul>
<li><strong>DOM</strong>: Il Document Object Model (DOM) è una forma di rappresentazione dei documenti strutturati come modello orientato agli oggetti. DOM definisce un API per accedere e manipolare file XML comune a diversi linguaggi.</li>
<li><strong>SAX</strong>: (Simple API for XML) è un&#8217;API per numerosi linguaggi di programmazione che permette di leggere ed elaborare dei documenti XML. Contrariarmente al DOM, il SAX processa i documenti linea per linea. Il flusso di dati XML è unidirezionale, così che dati a cui si è acceduto in precedenza non possono essere riletti senza la rielaborazione dell&#8217;intero documento.</li>
<li><strong>JDOM</strong>: JDom è un API per accedere ed elaborare documenti XMl specifica per il linguaggio di programmaziopne Java, che (rispettando il principio del 80/20) permette di sviluppare con semplicità l&#8217;80% delle applicazione, mentre richiede una soluzione ad HOC per il restante 20%&#8230; cioè JDom sacrifica parte della generalità per dar miglior supporto alle applicazioni più comuni.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>XML Retrieval</strong>: L&#8217;information retrieval (IR) è la disciplina che studia le tecniche utilizzate per il recupero mirato dell’informazione in formato elettronico.</li>
</ul>
<h2>Le Applicazioni XML</h2>
<p>XML è oggi una tecnologia matura ed utilizzata negli ambiti più disparati&#8230; basta provare a salvare un documento di testo scritto con il famosissimo word processor OpenOffice, rinominare questo file .zip, e provare ad estrarre il contenuto: dentro troveremo il nostro documento descritto in XML!!!</p>
<p>Un altro esempio è SVG, lo standard aperto per la grafica vettoriale che punta a sostituire la tecnologia &#8216;flash&#8217; sul web. Un file .svg è interamente scritto in XML, tant&#8217;è vero che si può aprire senza problemi con un qualsiasi editor di testo.</p>
<p>Alcuni linguaggi XML hanno avuto particolare successo come XHTML, CML (Chemical Markup Language), WML (usato nella tecnologia WAP dei cellulari), RSS ed altri&#8230; in particolare Mpeg7:</p>
<ul>
<li><strong>Mpeg-7</strong>: MPEG-7 è uno standard nato per codificare i contenuti multimediali; non è uno standard nato per codificare flussi audio o video come, ad esempio, MPEG-1 MPEG-2 o MPEG-4 ma per definire metadati sui dati multimediali.La codifica utilizza l&#8217;XML per memorizzare dei metadati che utilizzano a loro volta il timecode del filmato permettendo di sincronizzare i flussi multimediali con particolari eventi. Per esempio, permette di sincronizzare un filmato con i suoi sottotitoli o un video con il testo della canzone.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2009/09/introduzione-alla-tecnologia-xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduzione alle Espressioni Regolari</title>
		<link>http://www.fireteam.it/2009/09/introduzione-alle-espressioni-regolari/</link>
		<comments>http://www.fireteam.it/2009/09/introduzione-alle-espressioni-regolari/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 06:35:43 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[espressioni regolari]]></category>
		<category><![CDATA[regular expression]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/2009/09/introduzione-alle-espressioni-regolari/</guid>
		<description><![CDATA[Le espressioni regolari sono utili per descrivere la validità di valori, come ad esempio valori di attributi, dati caratteri, e qualsiasi tipo di valore esprimibile con un certo alfabeto.
Il concetto di espressione regolare è un formalismo importante utilizzato, in varie forme, in svariate applicazioni&#8230; ad esempio nei linguaggi di schema (come DTD di XML) per [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-685" title="ingranaggi" src="http://www.fireteam.it/wp-content/uploads/2009/09/ingranaggi.png" alt="ingranaggi" width="170" height="270" />Le espressioni regolari sono utili per descrivere la validità di valori, come ad esempio valori di attributi, dati caratteri, e qualsiasi tipo di valore esprimibile con un certo alfabeto.</p>
<p>Il concetto di espressione regolare è un formalismo importante utilizzato, in varie forme, in svariate applicazioni&#8230; ad esempio nei linguaggi di schema (come DTD di XML) per descrivere sequenze di elementi o caratteri. I linguaggi regolari sono utilizzati in molte altre aree dell&#8217;informatica oltre a XML, dall&#8217;elaborazione del testo e del linguaggio naturale alla verifica formale dei componenti hardware.</p>
<p>Potrebbe essere necessario, ad esempio, vincolare un valore &#8216;data&#8217; in modo tale da rispettare il formato dd-mm-yyyy, ovvero sia composto da due cifre per il giorno, seguite da due per il mese e quattro per l&#8217;anno, tutto separato da un segno meno “-”. Alternativamente possiamo specificare che un certo valore deve essere un numero intero.</p>
<p>Chiamiamo Σ un alfabeto consistente in un insieme di atomi, che tipicamente sono caratteri Unicode o nomi di elementi. Un&#8217;espressione regolare su Σ è costruita in base alle seguenti regole:</p>
<p><span id="more-679"></span></p>
<ul>
<li>ogni atomo in Σ, preso da solo, è un espressione regolare;</li>
<li>se a e b sono espressioni regolari, allora lo sono anche le seguenti:
<ul>
<li>
<pre>a?</pre>
</li>
<li>
<pre>a*</pre>
</li>
<li>
<pre>a+</pre>
</li>
<li>
<pre>a b</pre>
</li>
<li>
<pre>a|b</pre>
</li>
<li>
<pre>(a)</pre>
</li>
</ul>
</li>
</ul>
<p>Gli operatori ?, , e + hanno una precedenza superiore alla concatenazione (l&#8217;operatore vuoto o “giustapposizione”), che a sua volta ha una precedenza superiore a |. E&#8217; sempre possibile usare le parentesi per raggruppare sotto-espressioni, superando così le precedenze di default. L&#8217;espressione ab*|c, in cui l&#8217;alfabeto Σ contiene a, b, e c, è interpretata come (a(b*))|c e non a(b*|c).</p>
<p>Una stringa finita di atomi di Σ può corrispondere o meno a una data espressione regolare a:</p>
<ul>
<li>un atomo r appartenente a Σ corrisponde unicamente al singolo atomo r;</li>
<li>a? corrisponde ad a opzionalmente, ovvero a qualsiasi stringa corrisponda ad a più la stringa vuota;</li>
<li>a* corrisponde a zero o più ripetizioni delle stringhe che corrispondono ad a;</li>
<li>a+ corrisponde ad una o più ripetizioni delle stringhe che corrispondono ad a;</li>
<li>a b corrisponde a ciò a cui corrisponde &#8216;a&#8217; seguito da ciò a cui corrisponde b;</li>
<li>a|b corrisponde all&#8217;unione delle corrispondenze di a e b;</li>
<li>(a) ha le stesse corrispondente di a.</li>
</ul>
<p>L&#8217;espressione regolare (a(b*))|c corrisponde così a tutte le stringhe composte da una a seguite da zero o più b, oppure una singola c da sola.</p>
<p>Un linguaggio regolare è un insieme di stringhe che corrispondono a una qualche espressione regolare.</p>
<p>E&#8217; possibile definire un&#8217;espressione regolare d (che sta per digit, cifra) scrivendo:</p>
<pre>0|1|2|3|4|5|6|7|8|9</pre>
<p>laddove l&#8217;alfabeto è composto ad esempio da tutti caratteri Unicode. Possiamo partire da questa definizione per definire un&#8217;altra espressione regolare &#8216;data&#8217; scrivendo dd-dd-dddd. Naturalmente quest&#8217;espressione corrisponde anche a stringhe come 88-26-9995, che non denotano date reali, ma con un po&#8217; più di sforzo è possibile catturare precisamente l&#8217;insieme di stringhe desiderato: in effetti su può usare un linguaggio regolare per gestire correttamente anche gli anni bisestili, ma allora le cose si fanno parecchie complicate!</p>
<p>La seguente espressione regolare descrive gli interi con un alfabeto composto dalle dieci cifre e dal segno meno:</p>
<pre>0|-?(|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*</pre>
<p>Secondo questa definizione, -42, 0, 117 sono accettabili, mentre 000, -0 e 3.14 non lo sono.</p>
<p>Adesso facciamo l&#8217;ultimo esempio, più complicato! In XHTML il contenuto di un elemento table dev&#8217;essere una sequenza che consiste in un elemento opzionale &#8216;caption&#8217; seguito da un certo numero di elementi &#8216;col&#8217; o alternativamente &#8216;colgroup&#8217;, i quali a loro volta sono opzionalmente seguiti da un elemento &#8216;thead&#8217; e uno &#8216;tfoot&#8217;, per concludere almeno un elemento &#8216;tbody&#8217; (o alternativamente &#8216;tr&#8217;). Possiamo scrivere con un&#8217;espressione regolare:</p>
<pre>caption? ( col* | colgroup* ) thead? tfoot? ( tbody+ | tr+ )</pre>
<p>Esistono molte varianti delle espressioni regolari&#8230; ad esempio le regular expression del linguaggio perl: tuttavia la maggior parte di queste varianti si limita ad aggiungere zucchero sintattico alla notazione base che abbiamo appena presentato.</p>
<p>Un&#8217;estensione tipica sono gli intervalli di caratteri: [0-9], ad esempio, è una comoda abbreviazione per indicare le cifre al posto di 0|1|2|3|4|5|6|7|8|9. In modo analogo a{n,m} con n e m numeri interi non negativi, denota da n ad m ripetizioni di a. Un altro esempio sono le espressioni regolari usate nella suit di ufficio OpenOffice.</p>
<div id="attachment_682" class="wp-caption aligncenter" style="width: 857px"><a href="http://www.fireteam.it/wp-content/uploads/2009/09/er.jpg"><img class="size-full wp-image-682" title="EspressioneRegolare" src="http://www.fireteam.it/wp-content/uploads/2009/09/er.jpg" alt="Espressioni Regolari in OpenOffice" width="847" height="320" /></a><p class="wp-caption-text">Espressioni Regolari in OpenOffice</p></div>
<p>Questa è l&#8217;introduzione alle espressioni regolari; per lavorare efficientemente con un vero implementazione di queste espressioni richiede ulteriore studio.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2009/09/introduzione-alle-espressioni-regolari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
