Eelmises peatükis loodud ilmutamata võrrandeid lahendava predikaadi abil on lihtne modellerida Küberneetika Instituudis prohfessor Enn Tõugu juhtimisel loodud tehisintellektisüsteemi NUT.
NUT on inseneriarvutuste lihtsustamiseks. Inseneride põhitöö mingi uue toote, konstruktsiooni loomisel sarnaneb matemaatikaülesande lahendamisele: tuleb kasutatavate objektide omadusi kasutades arvutada ülesande püstituses (spetsifikatsioonis) antud suuruste abil kõik konstruktsiooni parameetrid. Selleks tuleb lähdudes antud suurustest (lähteparameetrid, mille väärtused on antud ülesande püstituses) samm-sammult otsida sobiv võrrand (protseduur, alamprogramm), mille abil saab arvutada mõne uue ülesande lahendamiseks vajaliku suuruse ja jatkata kuni kõik otsitavad suurused on arvutatud. Ülesanne on analoogiline keemiliste reaktsioonide abil mingite uute aintete sünteesimise ülesandega - olemasolevad või juba sünteesitud abiained on suurused, mille väärtus on juba teada, igal sammul tuleb leida sobiv reaktsioon/võrrand uute ainte/suuruste saamiseks ja jätkata seni, kuni on saadud kõik otsitavad ained/suurused; seega kuulub ka see ülesanne kaardil (mitmealuselisel graafil) tee otsimise ülesannete klassi.
Süsteemi töö põhineb teadmistel kasutatavate objektide omadustest; objektide omadusi kirjeldatakse mudelitega, mis kirjeldavad objekti parameetrite (objektis esinevate suuruste) vahelisi seoseid. Näiteks täisnurkse kolmnurga parameetreid: kaatetid A,B, hüpotenuus C, pindala S ja täisnurgast hüpotenuusile tõmmatud kõrguse H vahelisi seoseid võiks kirjeldada järgmise mudeliga:
comp(_,_):-
clause(stop,true),!, %lõpetusmärk alles - midagi ei õnnestnud enam arvutada
arvutused(A),write(A).
comp(_,Otsitavad):-
free_variables(Otsitavad,[]),
!,arvutused(A1),reverse(A1,A),write(A).
comp(Mudel,Otsitavad):-
assert(stop), % paneme (oletusena) lõpetusmärgi
call(Mudel),
comp(Mudel,Otsitavad).
valem(Valem):-
rel(Valem),!, %midagi õnnestus arvutada
retractall(stop), %võtame peatusmärgi maha
retract(arvutused(A)),assert(arvutused([Valem|A])).
valem(_).
arvutamudelid(Mudelid,Otsitavad):-
retractall(stop1),
assert(stop1), %oletusena paneme peatumismärgendi
arvutamitu(Mudelid,Otsitavad,Mudelid).
arvutamitu([Mudel|Mudelid],Otsitavad,Kõik_Mudelid):-
arvuta(Mudel,Otsitavad),nl,
((clause(stop,true), %mudelis õnnesus midagi arvutada!
retractall(stop1)); %võtame peatuse maha
true),
arvutamitu(Mudelid,Otsitavad,Kõik_Mudelid).%järgmised mudelid
arvutamitu([],Otsitavad,Kõik_Mudelid):-
not(clause(stop1,true)),!, %mingi mudeli abil õnnestus midagi arvutada
assert(stop1), %paneme peatuse uuesti ja käivitame kõik mudelid veel kord
arvutamitu(Kõik_Mudelid,Otsitavad,Kõik_Mudelid).
arvutamitu(_,_,_). %viimasel mudelite läbivaatusel ei õnnestunud midagi enam arvutada
A=4,C=5,arvutamudelid([kolmnurk(A,B,C,S,H),kolmnurk(H,A1,B,S1,H1)],[A1]).
[6 = 5*2.4/2, 6 = 4*3/2, 4*4 + 3*3 = 5*5]
[3.84 = 4*1.92/2, 3.84 = 2.4*3.2/2, 2.4*2.4 + 3.2*3.2 = 4*4]
2.Tee mudel kraana poolt tõstetava kasti põhja kõrguse (maast) leidmiseks, kui on teada kraana torni pikkus K, nokkade pikkused L1,L2, trossi pikkus L, nurgad a,b ja kasti kõrgus H; testi näiteks andmetega a=30, b=45 (kraadides), K=8, L1=4, L2=2, H=2 (meeldetuletuseks - täisnurkses kolmnurgas kaatet/hüpotenuus = vastasnurga siinus).