Prgramwanie w Lgice Wejście i wyjście (Lista 5) Przemysław Kbylański Wstęp Aby rzłżyć term na funktr i listę jeg argumentów należy użyć predykatu =.. w następujący spsób Term =.. [Funktr ListaArgumentów] Stałe traktwane są jak funktry zer-argumentwe, natmiast jeśli term jest zmienną, t nie da się g rzłżyć:?- f(a, b) =.. [F A]. F = f, A = [a, b].?- f(a, b) =.. X. X = [f, a, b].?- X =.. [f, 1, a]. X = f(1, a).?- a =.. X. X = [a].?- X =.. L. ERROR: =../2: Arguments are nt sufficiently instantiated?- 10 =.. X. X = [10].?- 2.5 =.. X. X = [2.5]. 1
Zadania Zadanie 1 (5 pkt) Pniżej przedstawin gramatykę BNF języka Imperatr: PROGRAM ::= PROGRAM ::= INSTRUKCJA ; PROGRAM INSTRUKCJA ::= IDENTYFIKATOR := WYRAŻENIE INSTRUKCJA ::= read IDENTYFIKATOR INSTRUKCJA ::= write WYRAŻENIE INSTRUKCJA ::= if WARUNEK then PROGRAM fi INSTRUKCJA ::= if WARUNEK then PROGRAM else PROGRAM fi INSTRUKCJA ::= while WARUNEK d PROGRAM d WYRAŻENIE ::= SKŁADNIK + WYRAŻENIE WYRAŻENIE ::= SKŁADNIK - WYRAŻENIE WYRAŻENIE ::= SKŁADNIK SKŁADNIK ::= CZYNNIK * SKŁADNIK SKŁADNIK ::= CZYNNIK / SKŁADNIK SKŁADNIK ::= CZYNNIK md SKŁADNIK SKŁADNIK ::= CZYNNIK CZYNNIK ::= IDENTYFIKATOR CZYNNIK ::= LICZBA_NATURALNA CZYNNIK ::= ( WYRAŻENIE ) WARUNEK ::= KONIUNKCJA r WARUNEK WARUNEK ::= KONIUNKCJA KONIUNKCJA ::= PROSTY and KONIUNKCJA KONIUNKCJA ::= PROSTY PROSTY ::= WYRAŻENIE = WYRAŻENIE PROSTY ::= WYRAŻENIE /= WYRAŻENIE PROSTY ::= WYRAŻENIE < WYRAŻENIE PROSTY ::= WYRAŻENIE > WYRAŻENIE PROSTY ::= WYRAŻENIE >= WYRAŻENIE PROSTY ::= WYRAŻENIE =< WYRAŻENIE PROSTY ::= ( WARUNEK ) Identyfikatry są słwami złżnymi z wielkich liter. Napisz predykat scanner(strumień, Tkeny), który czyta strumień znaków i zamienia g na listę tkenów, przy czym tkeny pwinny mieć następującą pstać: 2
key(słowo_kluczowe) gdzie SŁOWO_KLUCZOWE jest jednym ze słów kluczwych języka Imperatr: read, write, if, then, else, fi, while, d, d, and, r, md; int(liczba_naturalna) gdzie LICZBA_NATURALNA jest, jak sama nazwa wskazuje, liczbą naturalną; id(id) gdzie ID jest nazwą zmiennej będącą słwem złżnym z wielkich liter; sep(separator) gdzie SEPARATOR jest jednym z separatrów języka Imperatr: ;, +, -, *, / (, ), <, >, =<, >=, :=, =, /=. Przykład Załóżmy, że w pliku ex1.prg znajduje się następujący tekst: read N; SUM := 0; while N > 0 d SUM := SUM + N; N := N - 1; d; write SUM; Przykład wyknania skanwania na pwyższym pliku:?- pen( ex1.prg, read, X), scanner(x, Y), clse(x), write(y). [key(read),id(n),sep(;),id(sum),sep(:=),int(0),sep(;),key(while), id(n),sep(>),int(0),key(d),id(sum),sep(:=),id(sum),sep(+),id(n), sep(;),id(n),sep(:=),id(n),sep(-),int(1),sep(;),key(d),sep(;), key(write),id(sum),sep(;)] X = <stream>(0x7f8f0b61e0c0), Y = [key(read), id( N ), sep(;), id( SUM ), sep(:=), int(0), sep(;), key(while), id(...)...]. Uwaga T zadanie trzeba rzwiązać, b na następnych listach będziemy z nieg krzystać. Zadanie 2 (3 pkt) Będziemy ryswać szachwnice złżne z ciemnych i jasnych pól: ::::: ple ple ::::: ciemne jasne 3
Na plach szachwnicy mgą być umieszczne hetmany: :###: ple ### ple :###: ciemne ### jasne Napisz predykat bard(l), któreg parametrem jest lista liczb L. Rysuje n szachwnice N wierszach i N klumnach, gdzie N jest długścią listy L. Liczba na i-tej pzycji listy L, gdzie i {1, 2,..., N}, jest numerem wiersza (licznym d dłu planszy), w którym sti hetman ustawiny w i-tej klumnie. Uwaga Pamiętaj, że ple w lewym dlnym rgu szachwnicy jest zawsze ciemne. Przykład Na rysunku 1 przedstawin przykład użycia predykatu bard/1. W przykładzie tym wykrzystan prezentwany na wykładzie predykat hetmany/2, który znajduje ustawienie niebijących się hetmanów. Zadanie 3* (2 pkt) Na prlgwe termy mżna patrzeć jak na drzewa. Liśćmi takieg drzew są stałe i zmienne występujące w nim, natmiast wierzchłki wewnętrzne dpwiadają funktrm. Na rysunku 2 przedstawin w pstaci drzewa przykładwy term f1(f2(a2, a3), a1, f3(a4)). Obchdzenie drzewa reprezentująceg term rzpczyna się w jeg krzeniu. D pruszania się p drzewie służą następujące plecenia: in przejście z bieżąceg wierzchłka d pierwszeg jeg syna, ut pwrót d jca bieżąceg wierzchłka, next przejście d następneg brata, prev przejście d pprzednieg brata. Pwyższe plecenia przedstawin na rysunku 3. Plecenia będziemy zapisywać krócej pierwszą literą ich nazwy. Na rysunku 4 przedstawin przykładwe bejście wszystkich wierzchłków drzewa z rysunku 2 w klejnści wyknywania pleceń: iinnni. Napisz predykat brwse(term), który pzwala bchdzić drzew dpwiadające termwi Term. Za każdym razem gdy jesteśmy w wierzchłku, drukwany jest term w nim zakrzeniny (drukuj tak aby stałe nazwach rzpczynających się wielkimi literami były ujęte w cudzysłów). 4
?- hetmany(12, X), bard(x). ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: :###: ::::: :###: ::::: ::::: ::::: ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: :###: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: ::::: ::::: ::::: ::::: ### ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: :###: ::::: ::::: ::::: ::::: ::::: X = [1, 3, 5, 8, 10, 12, 6, 11, 2...] Rysunek 1: Przykład szachwnicy dla N = 12. f1 f2 a1 f3 a2 a3 a4 Rysunek 2: Term f1(f2(a2, a3), a1, f3(a4)). 5
funktr in ut next ut pierwszy argument prev drugi argument Rysunek 3: Plecenia d pruszania się p drzewie. i f1 a2 i f2 n n a3 a1 n i f3 a4 Rysunek 4: Obchdzenie drzewa zgdnie z pleceniami: iinnni. 6
P wydrukwaniu termu predykat pwinien czytać stałą dpwiadającą pierwszej literze plecenia i przejść w drzewie dalej zgdnie z tym pleceniem. Jeśli wpisan złą stałą alb nie mżna wyknać daneg plecenia (np. i gdy jesteśmy w liściu), t pzstajemy w bieżącym wierzchłku i jeszcze raz drukujemy zakrzeniny w nim term. Przykład Ot przykładwy dialg jak w sytuacji przedstawinej na rysunku 4:?- brwse(f1(f2(a2, a3), a1, f3(a4))). f1(f2(a2,a3),a1,f3(a4)) cmmand: i. f2(a2,a3) cmmand: : i. a2 cmmand: : n. a3 f2(a2,a3) cmmand: : n. a1 cmmand: : n. f3(a4) cmmand: : i. a4 f3(a4) f1(f2(a2,a3),a1,f3(a4)) true. 7