Пример. Предположим, дерево изображенное на рисунке отражает некую связь между фактами.
Факты, означающие прямую связь между узлами дерева, могут выглядеть так
dconnect(a,b) |
|
dconnect(a,c) |
|
dconnect(b,d) |
|
dconnect(b,e) |
|
dconnect(c,f) |
|
dconnect(c,g) |
|
dconnect(f,h) |
|
dconnect(f,i) |
|
Добавим косьвенную связь connect(X,Y) для исключения зацикливания.
Правило, определяющее маршрут вниз по дереву такое:
.connect(X,Y) if dconnect(X,Y).
connect(X,Y) if dconnect(X,Z), dconnect(Z,Y).
Простое правило всегда ставят первым- это уменьшит время поиска решения.
% Cушествует ли связь между X и Y ?
domains
city=string
predicates
dconnect(city,city)
connect(city,city)
wopros
clauses
connect(X,Y) if dconnect(X,Y).
connect(X,Y) if dconnect(X,Z), dconnect(Z,Y).
dconnect (a,b). dconnect (a,c). dconnect (b,d). dconnect (b,e).
dconnect (c,f). dconnect (c,q). dconnect (f,h). dconnect (f,i).
wopros:-
write(" Bведите от- "), readln(X),
write(" Bведите до- "), readln(Y),
connect(X,Y),nl,
write (" от ",X," до ",Y," есть связь "),
nl,!.
wopros:- write(" НЕТ РЕШЕНИЙ! ").
goal
makewindow(1,120,7," ответ ",16,0,8,60),
wopros.
Пример 9.ЭС показывает только способ получения конечного продукта
trail=100 /* размер внутренней области для ссылок */
nowarnings /* не выводить предупреждения */
domains
material = string
datadom = rxn(rpath)
rpath=path(material,list_mater)
list_mater= material*
spis=datadom*
database
predicates /* */
rawmaterial(material)
rxn(rpath)
syn(material,spis)
append(spis,spis,spis)
clauses
/*исходный материал */
rawmaterial(a). rawmaterial(b).
rawmaterial(c). rawmaterial(d).
rawmaterial(e). rawmaterial(f).
rawmaterial(f).
append([XX|L1],L2,[XX|Q]) if
append(L1,L2,Q),nl,write("--",Q).
/* реакция синтеза происходит при соединении а и b */
rxn(path(i,[e,b])). rxn(path(j,[c,d])). rxn(path(k,[e,f])).
rxn(path(l,[e,b])). rxn(path(m,[t,a])). rxn(path(n,[d,d])).
rxn(path(p,[i,j])). rxn(path(p,[n,m])). rxn(path(q,[i,j])).
rxn(path(r,[k,e])). rxn(path(w,[j,r])). rxn(path(w,[p,q])).
rxn(path(x,[n,q])). rxn(path(y,[m,p])). rxn(path(z,[w,k])).
rxn(path(z,[y,q])).
syn(Y,[]) if rawmaterial(Y).
syn(Y,L) if rxn(path(Y,[X1,X2])),
nl,write("-->",Y,X1,X2),
syn(X1,L1), nl,write("L1",L1),
syn(X2,L2), nl,write("L2",L2), append(L1,L2,Q), nl,write("Q",Q),
append([rxn(path(Y,[X1,X2]))],Q,L), nl,write("QL",Q).
syn(F,G):-write("больше решений нет!").
goal
makewindow(1,121,7," ответ ",16,0,8,80), syn(w,X).