Опубликован: 12.02.2014 | Уровень: для всех | Доступ: платный
Лекция 12:

Язык запросов

Вывод данных на печать

Далее создается класс printData с одноименным интерфейсом, предназначенный для вывода данных на печать (листинги 12.1012.12).

properties
    db : dbrel.

predicates
    printRel: (unsigned, unsigned).
    printDb: ().
    printDb: (string Sex).
    getName: (unsigned) -> string.
    getNamesStr: (unsigned*) -> string.
Пример 12.10. Интерфейс printData
constructors
    new: (dbrel).
Пример 12.11. Декларация класса printData
open core, console

facts
    db : dbrel.
clauses
    new(Db):-
        db := Db.

    printRel(Id1, Id2):-
        writef("% - %\n", getName(Id1), getName(Id2)).

    printDb():-
        printDb("").

    printDb(S):-
        db:person_nd(Id, Name, Surname, Sex, IdF, IdM),
            checkSex(S, Sex),
            SpList = getSpouses(Id, Sex),
            Spouses = getNamesStr(SpList),
            writef("%-3%-10%-12%-3%-20%-20%\n", Id, Name,
                Surname, Sex, getName(IdF), getName(IdM), Spouses),
        fail.
    printDb(_).

    getName(Id) = string::format("% %", Name, Surname):-
        db:person_nd(Id, Name, Surname, _, _, _),
        !.
    getName(_) = "-".

    getNamesStr(IdL) = string::concatWithDelimiter(NL, ", "):-
        NL = list::map(IdL, {(Id) = getName(Id)}).

predicates
    checkSex: (string, string Sex) determ.
    getSpouses: (unsigned Id, string Sex) -> unsigned*.
clauses
    checkSex("", _):- !.
    checkSex(S, S).

    getSpouses(Id, dbrel::male) = [IdS || db:spouse_nd(Id, IdS)]:- !.
    getSpouses(Id, _) = [IdS || db:spouse_nd(IdS, Id)].
Пример 12.12. Имплементация класса printData
Считывание данных

Теперь создается класс readData с одноименным интерфейсом, который используется для получения сведений от пользователя (листинги 12.1312.15).

properties
    pd : printData.

predicates
    readName: () -> string determ.
    readSurname: () -> string determ.
    readSex: () -> string determ.
    readFather: () -> unsigned.
    readMother: () -> unsigned.
    readSpouse: (string Sex) -> unsigned.
    readStr: () -> string.
    readNonEmptyStr: () -> string determ.
    getIdFromStr: (string) -> unsigned.
    getIdFromUser: () -> unsigned determ.
Пример 12.13. Интерфейс readData
constructors
    new: (printData).
Пример 12.14. Декларация класса readData
open core, console

facts
    pd : printData.

clauses
    new(PD):-
        pd := PD.

    readName() = Name:-
        write("Введите имя: "),
        Name = readNonEmptyStr().

    readSurname() = Surname:-
        write("Введите фамилию: "),
        Surname = readNonEmptyStr().

    readSex() = Sex:-
        writef("Введите пол (%/%): ", dbrel::male, dbrel::female),
        Sex = string::toLowerCase(readNonEmptyStr()),
        (Sex = dbrel::male; Sex = dbrel::female),
        !.

    readFather() = IdF:-
        write("Все мужчины:\n"),
        pd:printDb(dbrel::male),
        write("Укажите номер отца (или нажмите Enter): "),
        IdF = getIdFromStr(readStr()).

    readMother() = IdM:-
        write("Все женщины:\n"),
        pd:printDb(dbrel::female),
        write("Укажите номер матери (или нажмите Enter): "),
        IdM = getIdFromStr(readStr()).

    readSpouse(Sex) = IdS:-
        S = if Sex = dbrel::male then "и" else "а" end if,
        writef("Укажите номер супруг% (или нажмите Enter): ", S),
        IdS = getIdFromStr(readStr()).

    readStr() = string::trim(readLine()).

    readNonEmptyStr() = Str:-
        Str = readStr(),
        Str <> "".

    getIdFromStr(S) = Id:-
        Id = tryToTerm(unsigned, S),
        pd:getName(Id) <> "-",
        !.
    getIdFromStr(_) = 0.

    getIdFromUser() = Id:-
        Name = readName(),
        Surname = readSurname(),
        NamesakeList = getNamesakes(Name, Surname),
        Id = getId(NamesakeList).

predicates
    getNamesakes: (string Name, string Surname) ->
        tuple{unsigned, string, string, string, unsigned, unsigned}*.
    getId: (tuple{unsigned, string, string, string, unsigned,
        unsigned}*) -> unsigned determ.
    printPersons: (tuple{unsigned, string, string, string, unsigned,
        unsigned}*).
clauses
    getNamesakes(Name, Surname) = [tuple(I, N, S, Sex, F, M) ||
        pd:db:person_nd(I, N, S, Sex, F, M),
        string::equalIgnoreCase(Name, N),
        string::equalIgnoreCase(Surname, S)].

    getId([tuple(Id, _, _, _, _, _)]) = Id:- !.
    getId([]) = _:- !,
        write("\nТаких сведений нет в базе данных\n"),
        fail.
    getId(L) = Id:-
        printPersons(L),
        write("\nУкажите номер: "),
        Id = getIdFromStr(readStr()).

    printPersons(L):-
        list::forAll(L, {(tuple(Id, Name, Surname, Sex, F, M)):-
            writef("% - % - % - % - % - %\n", Id, Name, Surname,
                Sex, pd:getName(F), pd:getName(M))}).
Пример 12.15. Имплементация класса readData

Предикат equalIgnoreCase проверяет, равны ли строки с точностью до регистра символов.

Жаныл Айкын
Жаныл Айкын
Rustam Inatov
Rustam Inatov

Доброго времени суток, подскажите пожалуйста, visual prolog examples, pie, vip7.5 - это все, где я могу скачать? (в смысле) может быть на сайте есть какой-то архив? Увы я не нашел его.

Подскажите, пожалуйста.

С уважением, Рустам.

Айдана Ахметова
Айдана Ахметова
Россия
Дмитрий Куянов
Дмитрий Куянов
Россия, Омск, ОмГТУ