/* Broj trideset se lako može predstaviti sa tri petice: 5*5+5=30. Teže je ovo postići sa druge tri jednake cifre. Napisati Prolog predikat koji pronalazi sva takva predstavljanja. Operacije koje se mogu javljati među ciframa su sabiranje, oduzimanje, množenje, deljenje i slepljivanje (slepljivanjem 1 i 23 dobija se broj 123, slepljivanjem 12 i 3 dobija se 123). Neće se uvažiti rešenje gde se „ručno“ došlo do rezultata. */ izvrsi_operaciju(X,Y,R,+):-saberi(X,Y,R). izvrsi_operaciju(X,Y,R,-):-oduzmi(X,Y,R). izvrsi_operaciju(X,Y,R,*):-pomnozi(X,Y,R). izvrsi_operaciju(X,Y,R,/):-podeli(X,Y,R). izvrsi_operaciju(X,Y,R,con):-slepi(X,Y,R). saberi(X,Y,R):-R is X+Y. oduzmi(X,Y,R):-R is X-Y. pomnozi(X,Y,R):-R is X*Y. podeli(X,Y,R):-R is X // Y. broj_cifara(0,0). broj_cifara(X,R):-X>0,X1 is X // 10, broj_cifara(X1,R1),R is R1 + 1. slepi(X,Y,R):-broj_cifara(Y,BY),X1 is X * (10 ** BY), R is X1 + Y. tri_iste(Broj,Cifra,Z):-izvrsi_operaciju(Cifra,Cifra,Rez,Op1),izvrsi_operaciju(Rez,Cifra,Broj,Op2), zapis(Cifra,Cifra,Op1,Z1),zapis(Z1,Cifra,Op2,Z). zapis(X,Y,+,+(X,Y)). zapis(X,Y,*,*(X,Y)). zapis(X,Y,-,-(X,Y)). zapis(X,Y,/,/(X,Y)). % slepljeni broevi bice predstavljeni listom u zapisu % dakle [2,5] znaci "lepljenje" cifara 2 i 5 tj. broj 25, dok zapis [5*5,5] oznacava % mnozenje cifara 5*5 (tj. 25), nakon cega se dopise 5 (tj. 255). zapis(X,Y,con,[X,Y]). generisi_cifru(1). generisi_cifru(2). generisi_cifru(3). generisi_cifru(4). generisi_cifru(5). generisi_cifru(6). generisi_cifru(7). generisi_cifru(8). generisi_cifru(9). % poziva se sa prikazi(Broj) (za 30 prikazi(30) :) ). % ako za neku cifru nije moguce pronaci zapis, prosto se ne prikazuje nista ispod teksta % 'moguci zapisi:'. prikazi(Broj):-generisi_cifru(Cifra),write('Za cifru: '),write(Cifra),nl, write('Moguci zapisi: '),nl, tri_iste(Broj,Cifra,Zapis), write(Zapis),nl,fail. pj2006012:-prikazi(30).