ВУЗ:
Составители:
Рубрика:
25
Разберемся, как это происходит: p1 всегда успешен, затем
выполняется всегда успешное первое правило предиката repeat и
Пролог устанавливает указатель отката на второе правило. Вы-
полняется p2. После неуспеха p_control выполняется второе пра-
вило repeat:-repeat, после чего первое правило, указатель отката
устанавливается на второе правило, далее p2, p_control и т. д.
Приведем простой пример использования repeat. Требуется
загрузить факты БД
со значениями, вводимыми с клавиатуры.
Предикат check_cont запрашивает пользователя о разрешении
ввода группы значений факта fact, предикат vvod принимает зна-
чения.
database
fact(string,string,string)
predicates
repeat
check_cont
vvod
goal
vvod,exit.
clauses
repeat.
repeat:-repeat.
vvod:-
retractall(fact(_,_,_)),
write("Начинаем процесс ввода значений"),nl,
repeat,
clearwindow,
write("A?"),readln(A),nl,
write("B?"),readln(B),nl,
write("C?"),readln(C),nl,
assert(fact(A,B,C)),
check_cont.
check_cont:-
write("ВВОДИТЬ ДАЛЕЕ? (Y|N)"),
readchar(Ans),Ans='N',!,
write("Процесс завершен"),readchar(_).
26
3.5. Списки в Прологе
3.5.1. Примеры списков
domains
list_integer=integer*
list_struct=el2*
el=e(list_integer)
el2=l(integer,symbol)
predicates
p1(list_integer)
p2(list_struct)
goal
L1=[1,2,3,4]
%Списки списков
L2=[e([10,40,50]),e([30,20])]
....................................
%Списки структур
L3=[l(1,"Fortran"),l(2,"Algol"),l(3,"PL/1")],
write("Языки программирования"),nl,
p2(L3),
search(3,L1),
....................................
3.5.2. Разделение списков на "голову" и "хвост"
Основным приемом работы со списками является представле-
ние списков в виде "Головы" (Head) и "Хвоста" (Tail). Для иллюст-
рации напишем правило для предиката p2 из предыдущего раздела:
clauses
p2([]).
p2([l(I,S)|T]):-
write(I," ",S),nl,
p2(T).
Поиск элемента в списке
:
search(H,[H,_]).
search(H,[_,T]):-search(H,T).
Разберемся, как это происходит: p1 всегда успешен, затем 3.5. Списки в Прологе
выполняется всегда успешное первое правило предиката repeat и
Пролог устанавливает указатель отката на второе правило. Вы- 3.5.1. Примеры списков
полняется p2. После неуспеха p_control выполняется второе пра- domains
вило repeat:-repeat, после чего первое правило, указатель отката list_integer=integer*
устанавливается на второе правило, далее p2, p_control и т. д. list_struct=el2*
Приведем простой пример использования repeat. Требуется el=e(list_integer)
загрузить факты БД со значениями, вводимыми с клавиатуры. el2=l(integer,symbol)
Предикат check_cont запрашивает пользователя о разрешении
ввода группы значений факта fact, предикат vvod принимает зна- predicates
чения. p1(list_integer)
database p2(list_struct)
fact(string,string,string) goal
predicates L1=[1,2,3,4]
repeat %Списки списков
check_cont L2=[e([10,40,50]),e([30,20])]
vvod ....................................
goal %Списки структур
vvod,exit. L3=[l(1,"Fortran"),l(2,"Algol"),l(3,"PL/1")],
write("Языки программирования"),nl,
clauses p2(L3),
repeat. search(3,L1),
repeat:-repeat. ....................................
vvod:-
retractall(fact(_,_,_)), 3.5.2. Разделение списков на "голову" и "хвост"
write("Начинаем процесс ввода значений"),nl,
repeat, Основным приемом работы со списками является представле-
clearwindow, ние списков в виде "Головы" (Head) и "Хвоста" (Tail). Для иллюст-
write("A?"),readln(A),nl, рации напишем правило для предиката p2 из предыдущего раздела:
write("B?"),readln(B),nl, clauses
write("C?"),readln(C),nl, p2([]).
assert(fact(A,B,C)), p2([l(I,S)|T]):-
check_cont. write(I," ",S),nl,
check_cont:- p2(T).
write("ВВОДИТЬ ДАЛЕЕ? (Y|N)"),
readchar(Ans),Ans='N',!, Поиск элемента в списке:
write("Процесс завершен"),readchar(_). search(H,[H,_]).
search(H,[_,T]):-search(H,T).
25 26
Страницы
- « первая
- ‹ предыдущая
- …
- 11
- 12
- 13
- 14
- 15
- …
- следующая ›
- последняя »
