• Non ci sono risultati.

PROLOG: strutture dati non lineari

N/A
N/A
Protected

Academic year: 2021

Condividi "PROLOG: strutture dati non lineari"

Copied!
11
0
0

Testo completo

(1)

Strutture dati non lineari

Esercitazione 3

(2)

Sommario

Liste di liste

(3)

Valutazione di espressioni

Scrivere un programma che ha come input una espressione aritmetica rappresentata per mezzo si un opportuno termine e ne calcola il valore. evalExpression(plus(A,B), N):- evalExpression(A, N1), evalExpression(B, N2), N is N1+N2. evalExpression(minus(A,B), N):- evalExpression(A, N1), evalExpression(B, N2), N is N1-N2. evalExpression(mult(A,B), N):- evalExpression(A, N1), evalExpression(B, N2), N is N1*N2. evalExpression(frac(A,B), N):- evalExpression(A, N1), evalExpression(B, N2), N is N1 // N2. evalExpression(X, X).

(4)

Prolog: Liste di liste

memberlist(X,L) X `e un elemento della lista di liste L.

memberlist(X,Y) `e vero se `e verificata una delle seguenti con-dizioni:

- X `e il primo elemento di L

- X non `e il primo elemento di L , il primo elemento di L `e una lista ed X `e membro del primo elemento di L.

- X `e membro del resto di L.

memberlist(X,[X|_Xs]).

memberlist(X,[Y|_Ys]) :- memberlist(X,Y). memberlist(X,[_Y|Ys]) :- memberlist(X,Ys).

(5)

Prolog: Alberi binari

binary tree(X) `e vero se X `e un albero, ovvero se una delle seguenti condizioni vale:

- X `e l’albero vuoto.

- X `e una struttura composta da una informazione e due sotto-strutture, anch’esse alberi binari.

binary_tree(void).

binary_tree(tree(_Element,Left,Right))

(6)

Alberi binari: isomorfismo

isotree(X,Y) `e vero se X ed Y sono isomorfi, ovvero se `e vera una delle seguenti:

- X ed Y sono entrambi l’albero vuoto

- X ed Y hanno lo stesso elemento come radice ed i sottoal-beri sinistri e destri sono isomorfi

isotree(void,void).

isotree(tree(X,Left1,Right1),tree(X,Left2,Right2)) :-isotree(Left1,Left2), isotree(Right1,Right2). isotree(tree(X,Left1,Right1),tree(X,Left2,Right2)) :-isotree(Left1,Right2), isotree(Right1,Left2).

(7)

Alberi binari: visita in preordine

preorder (X,Y): Y `e la lista che contiene la visita in preordine dell’albero X.

preorder (void, [void]).

preorder (tree(X, Left, Right), CompleteList):-preorder(Left, LeftList),

preorder(Right, RightList),

(8)

Alberi: visita in ampiezza

breadth first(X,Y): Y `e la lista che contiene il risultato della visita in ampiezza dell’albero Y .

bf([], []).

bf([void | Rest], Ls):- bf(Rest, Ls). bf([tree(I, Dx, Sx)| Rest],

(9)

Esercizi

1. Scrivere un programma che conta gli elementi di una lista di liste.

2. Scrivere un programma per verificare se una costante ap-partiene ad un albero binario.

3. Scrivere un programma che compone una lista con tutti i nodi a profondita’ D di un albero.

(10)

Esercizio d’esame

a) Si considerino dei termini Prolog che rappresentano degli alberi binari i cui nodi contengono un simbolo di costante ed un numero che indica la profondit`a del nodo. Scri-vere un programma PROLOG che restituisce vero se il suo argomento `e un albero binario con le caratteristiche specificate.

b) Scrivere un programma PROLOG che dato un albero bi-nario ed una costante restituisca la profondit`a di un nodo che contiene la costante specificata.

(11)

bi-sono presenti ed una costante, restituisca la profondit`a di un nodo che contiene la costante specificata.

d) Scrivere un programma PROLOG che dato un albero bi-nario in cui le informazioni sulla profondit`a dei nodi non sono presenti restituisca un albero binario contenente le informazioni sulla profondit`a dei nodi.

Riferimenti

Documenti correlati

% Restituisce il primo figlio, oppure nil se questo nodo è una foglia Tree leftmostChild (). % Restituisce il prossimo fratello, oppure nil se assente Tree

% Restituisce il primo figlio, oppure nil se questo nodo è una foglia Tree leftmostChild (). % Restituisce il prossimo fratello, oppure nil se assente Tree

Una rotazione a destra a partire da n ci porta ad una situazione in cui t e n sono figli di p; colorando n di rosso e p di nero ci troviamo in una situazione in cui tutti i

Una rotazione a destra a partire da n ci porta ad una situazione in cui t e n sono figli di p; colorando n di rosso e p di nero ci troviamo in una situazione in cui tutti i

- La lista degli stati da visitare deve essere organizzata come una lista di triple [S,PATH,LISTA_OP] in cui PATH è un cammino dallo stato iniziale allo stato S e LISTA_OP

Dato un albero binario i cui nodi sono colorati di rosso o di nero, progettare un algoritmo efficiente che calcoli il numero di nodi aventi lo stesso numero di discendenti rossi

• In un albero binario la profondità di un nodo è la lunghezza del percorso dalla radice al nodo (cioè il numero di archi tra la radice e il nodo). • L’altezza dell’albero

• precedenza (è indicata con un numero, compreso in un intervallo dipendente dalla particolare implementazione, più basso è il numero, più alta è la precedenza