Подборка лаб выполненых в Arity Prologе / ARI_DOC / LABA_3
.DOCПрограмма о методе Монте-Карло :
fakt('c,b').
pfakt('c,b',1).
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_celi(Cel):-
nl,write('Введите цель ... '),
read(Cel),
!.
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(Cel):-
call(Cel),
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_celi(Cel),
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(Cel),
N2==N,
retract(uspechi(N_usp)),
P is N_usp/N,
nl,write('Вероятность = '),
write(P),
chistka_base.
ok:- sob('a,c,d').
ok:- sob('a,b,d').
ok:- sob('a,c,b,d').
sob('a,b,d'):- fakt('a,b'),
fakt('b,d').
sob('a,c,d'):- fakt('a,c'),
fakt('c,d').
sob('a,c,b,d'):- fakt('a,c'),
fakt('c,b'),
fakt('b,d').
Тестовые примерчики :
Введите список событий ... ['a,b,d','a,c,d'].
Укажите вероятность события <a,b,d> 0.9.
Укажите вероятность события <a,c,d> 0.8.
Введите случайные факты ... ['a,b','b,d'].
Укажите вероятность факта <a,b> 0.9.
Укажите вероятность факта <b,d> 0.6.
Введите цель ... ok.
Количество испытаний = 25.
Вероятность = 0.4
yes
Введите список событий ... ['a,b,d'].
Укажите вероятность события <a,b,d> 0.99.
Введите случайные факты ... ['a,c','c,d'].
Укажите вероятность факта <a,c> 0.5.
Укажите вероятность факта <c,d> 0.5.
Введите цель ... ok.
Количество испытаний = 10.
Вероятность = 0.0
yes
Программа об абдукции :
p1 p1-?
a b p2=0,9
p2 p4 p3-?
p4=0,6
c d q – конечный результат ( из a в d )
p4
В качестве исходной программы использую предыдущую. Положу, что события происходят с одинаковой вероятностью p=0.5.
q=a+b*p1+c*p3+d*p1*p3
Проведем эсперименты : ( найдем q )
-
p1
p3
q
0
0
0.152
0
1
0.566
1
0
0.822
1
1
0.95
По данной таблице найдем значения коэффициентов a, b, c, d.
a=0.152 p1=p3=0
b=0.67 p3=0 p1=1
c=0.414 p1=0 p3=1
d=-0.286 p1=p3=1
Следовательно, уравнение поверхности :
q=0.152+0.67*p1+0.414*p3-0.286*p1*p3
Эксперименты :
Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].
Укажите вероятность события <a,b,d> 0.5.
Укажите вероятность события <a,c,d> 0.5.
Укажите вероятность события <a,c,b,d> 0.5.
Введите случайные факты ... ['a,b','a,c','c,d','b,d'].
Укажите вероятность факта <a,b> 0.
Укажите вероятность факта <a,c> 0.9.
Укажите вероятность факта <c,d> 0.6.
Укажите вероятность факта <b,d> 0.
Введите цель ... ok.
Количество испытаний = 1000.
Вероятность = 0.152
Yes
Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].
Укажите вероятность события <a,b,d> 0.5.
Укажите вероятность события <a,c,d> 0.5.
Укажите вероятность события <a,c,b,d> 0.5.
Введите случайные факты ... ['a,b','a,c','c,d','b,d'].
Укажите вероятность факта <a,b> 0.
Укажите вероятность факта <a,c> 0.9.
Укажите вероятность факта <c,d> 0.6.
Укажите вероятность факта <b,d> 1.
Введите цель ... ok.
Количество испытаний = 1000.
Вероятность = 0.566
yes
Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].
Укажите вероятность события <a,b,d> 0.5.
Укажите вероятность события <a,c,d> 0.5.
Укажите вероятность события <a,c,b,d> 0.5.
Введите случайные факты ... ['a,b','a,c','c,d','b,d'].
Укажите вероятность факта <a,b> 1.
Укажите вероятность факта <a,c> 0.9.
Укажите вероятность факта <c,d> 0.6.
Укажите вероятность факта <b,d> 0.
Введите цель ... ok.
Количество испытаний = 1000.
Вероятность = 0.822
yes
Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].
Укажите вероятность события <a,b,d> 0.5.
Укажите вероятность события <a,c,d> 0.5.
Укажите вероятность события <a,c,b,d> 0.5.
Введите случайные факты ... ['a,b','a,c','c,d','b,d'].
Укажите вероятность факта <a,b> 1.
Укажите вероятность факта <a,c> 0.9.
Укажите вероятность факта <c,d> 0.6.
Укажите вероятность факта <b,d> 1.
Введите цель ... ok.
Количество испытаний = 1000.
Вероятность = 0.95
Y es
Зная уравнение поверхности q=0.152+0.67*p1+0.414*p3-0.286*p1*p3
легко построить ее сечение