ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »