Программирование в Логике. Чанышев О.Г. - 13 стр.

UptoLike

Составители: 

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