Подборка лаб выполненых в Arity Prologе / ARI_DOC / MONT_CRL
.DOCПрограмма вычисления вероятности события методом MONTE-CARLO
prinadl(Z,[Z|_]).
prinadl(Z,[_|X]):-
prinadl(Z,X).
vvod_ver:-
nl,write('Введите список событий ... '),read(Sob),ver_sob(Sob),
nl,write('Введите случайные факты ... '),read(Fakt),ver_fakt(Fakt).
ver_sob(Sob):-
prinadl(Sob1,Sob),
nl,write('Укажите вероятность события <'),write(Sob1),write('> '),
read(Ver1),asserta(psob(Sob1,Ver1)),fail.
ver_sob(_):-!.
ver_fakt(Fakt):-
prinadl(Fakt1,Fakt),
nl,write('Укажите вероятность факта <'),write(Fakt1),write('> '),
read(Ver1),asserta(pfakt(Fakt1,Ver1)),fail.
ver_fakt(_):-!.
vvod_zeli(Zel):-
nl,write('Введите цель ... '),read(Zel),!.
tek_sob:-
psob(Sob,Ver),Rand is random,
ifthen(Rand>Ver,asserta((sob(Sob):-!,fail))),fail.
tek_sob:-!.
tek_fakt:-
pfakt(Fakt,Ver),Rand is random,
ifthen(Rand<Ver,asserta(fakt(Fakt))),fail.
tek_fakt:-!.
dokazat(Zel):-
call(Zel),
retract(uspechi(N)),N1 is N+1,asserta(uspechi(N1)),!.
dokazat(_):-!.
chistka_tek:-
repeat,not(retract((sob(_):-!,fail))),not(retract(fakt(_))).
chistka_tek:-!.
chistka_base:-
chistka_tek,
repeat,not(retract(psob(_,_))),not(retract(pfakt(_,_))).
chistka_base:-!.
start:-
vvod_ver,vvod_zeli(Zel),asserta(uspechi(0)),
write('Количество испытаний = '),read(N),asserta(tek_num(0)),
repeat,
chistka_tek,tek_sob,tek_fakt,
retract(tek_num(N1)),N2 is N1+1,asserta(tek_num(N2)),
dokazat(Zel),N2==N,retract(uspechi(N_usp)),P is N_usp/N,
nl,write('Вероятность = '),write(P),chistka_base.
sdal:- not(sob('проспал')),sob('готов').
sdal:- sob('повезло').
sob('проспал'):- fakt('давно не спал'),fakt('поздно лег'),
fakt('сломан будильник').
sob('готов'):- fakt('читал'),fakt('написал шпоргалки').
sob('готов'):- fakt('зубрило').
sob('повезло'):- fakt('везунчик').
sob('повезло'):- fakt('молился на ночь').
Тестовый пример:
?- start.
Введите список событий ... ['проспал','готов','повезло'].
Укажите вероятность события <проспал> 0.4.
Укажите вероятность события <готов> 0.95.
Укажите вероятность события <повезло> 0.8.
Введите случайные факты ... ['давно не спал','поздно лег','сломан будильник',
'читал','написал шпоргалки','зубрило','везунчик','молился на ночь'].
Укажите вероятность факта <давно не спал> 0.3.
Укажите вероятность факта <поздно лег> 0.7.
Укажите вероятность факта <сломан будильник> 0.05.
Укажите вероятность факта <читал> 0.95.
Укажите вероятность факта <написал шпоргалки> 0.5.
Укажите вероятность факта <зубрило> 0.2.
Укажите вероятность факта <везунчик> 0.6.
Укажите вероятность факта <молился на ночь> 0.1.
Введите цель ... sdal.
Количество испытаний = 1000.
Вероятность = 0.783
yes