Инструменты пользователя

Инструменты сайта


examination:flp:question65

readreal

Предикат readreal работает в соответствии со своим названием: он считывает вещественные числа (аналогично тому, как readint считывает целые). Предикат readreal ипользует следующий формат:

 readreal(X) % (о)

Домен для переменной X должен быть вещественного типа, а X должна перед вызовом быть свободна. Предикат readreal будет читать вещественные значения с текущего устройства ввода, пока не будет нажат клавиша Enter. Если ввод не соответствующих обычному синтаксису вещественных чисел, то readreal терпит неудачу. Если во время ввода нажать клавишу Esc, readreal также терпит неудачу.

renamefile

Предикат renamefile переименовывает файл с именем OldOSFileName в NewOSFileName. Он имеет формат:

 renamefile(OldOSFileName, NewOSFileName) %(i,i)

Предикат renamefile будет успешен, если файл с именем NewOSFileName не существует, и оба имени являются допустимыми файловыми именами. В противном случае будет выдана ошибка.

retract

Читать билет по database

Для добавления новых фактов в базу данных в Прологе используются предикаты insert, asserta, assertz, а предикаты retract и retractall служат для удаления существующих фактов. Вы можете изменить содержание вашей базы фактов, сначалa удалив факт, а потом вставив новую версию этого факта (или совершенно другой факт). Предикаты consult/1 и consult/2 считывают факты из файла и добавляют их к внутренней базе данных, a save/1 и save/2 сохраняют содержимое внутренней базы фактов в файле.

Предикат retract унифицирует факты и удаляет их из внутренней базы фактов. Он имеет следующий формат:

 retract(the fact) % (i) 
 retract(the fact,databaseName) % (i,i)

Предикат retract удаляет первый факт из вашей базы данных, который совпадает с фактом the fact, связывая свободные переменные the fact во время выполнения программы. Удаление фактов из внутренней базы фактов эквивалентно процессу доступа к ним с побочным эффектом удаления унифицировавшихся фактов. retract является недетерминированным, если предикат базы фактов, удаляемый retract, не был объявлен детерминированным. При поиске с возвратом предикат retract удаляет все унифицировавшиеся факты, пока они имеются, после чего он далее не находит нужных фактов и завершается неуспешно.

Предположим, в вашей программе имеются следующие разделы

 database
    person(string,string,integer)
 database - likesDatabase
    likes(string,string)
    dislikes(string,string)
 clauses
    person("Fred","Capitola",35).
    person("Fred","Omaha",37).
    person("Michael","Brooklyn",26).
    likes("John","money").
    likes("Jane","money").
    likes("Chris","chocolate").
    likes("John","broccoli").
    dislikes("Fred","broccoli").
    dislikes("Michael","beer").

Имея такие разделы database, Прологу можно задать следующие цели:

 retract(person("Fred",_,_)), % 1
 retract(likes(_,"broccoli")), % 2
 retract(likes(_,"money"),likesDatabase),	% 3
 retract(person("Fred",_, _),likesDatabase).% 4

Первая цель удалит первый факт person о Fred из базы фактов dbasedom. С помощью второй цели из базы фактов likesDatabase будет удален первый факт, совпадающий с likes(X,«broccoli»). В случае обеих целей, Пролог знает, из какой базы производить удаление, поскольку имена предикатов базы фактов уникальны: предикат person находится только в неименованной базе данных фактов, a likes - только в базе likesDatabase.

Третья и четвертая цель показывают, как вы можете использовать для проверки типа второй аргумент. Третья цель успешно реализуется, удаляя первый факт, совпадающий с likes(_,«money») из likesDatabase, а четвертая цель выдаст ошибку, потому что нет (и не может быть) факта person в базе данных фактов likesDatabase. Сообщение об ошибке выглядит следующим образом: 506 Type error:The functor does not belong to the domain. (Ошибка типа: Функтор не относится к данному домену)

Следующая цель иллюстрирует, как вы можете получить значения из предиката

 retract:
 goal
    retract(person(Name,Age)),
    write(Name,",",Age),nl,
    fail.

Когда вы в качестве второго аргумента retract задаете имя базы фактов, вы можете не указывать имя предиката базы фактов, из которого вы удаляете факты. В этом случае retract будет искать и удалять все факты в указанной базе данных. Например:

 goal
    retract(X,mydatabase),
    write(X),
    fail.

Удаление нескольких фактов сразу

Предикат retractall удаляет из вашей базы фактов все факты, сопадающие с образцом the fact. Предикат retractall имеет следующий формат:

 retractall(the fact)
 retractall(the fact,databaseName)

действие retractall аналогично действию, заданному

 retractall(X):-
   retract(X),
   fail, 
   retractall(_).

но значительно быстрее него.

Очевидно, предикат retractall всегда завершается успешно. Из retractall выходные значения получить нельзя. Это означает, что, как и в случае not, нужно использовать символ подчеркивания для свободных переменных.

Так же, как и в случае предикатов assert и retract, для проверки типа можно использовать второй аргумент. И, как в случае предиката retract, если при вызове retractall используется символ подчеркивания, то из указанного раздела database можно удалить все факты.

Следующая цель удаляет все факты о мужчинах из базы фактов с фактами person:

 retractall(person(_,_,_,male)).
   Следующая цель удаляет все факты из базы mydatabase. 
 retractall(_,mydatabase).

removewindow

Предикат removewindow удаляет текущее окно с экрана. Предикат аргументов не имеет, поэтому его синтаксис прост:

   removewindow. 

Все текстовые и графические изображения, находящиеся в окне, также удаляются. Если за данным окном находится другое окно, то это окно и его содержимое становятся видимыми. Если удаляется последнее из заданных окон, на экране появляется то изображение, которое было на нем до создания окон.

reference

Ссылки домена, который может иметь свободные переменные в качестве входных аргументов.

DOMAINS
reflist = reference refint*
refint  = reference integer
term    = reference int(refint); symb(refsymb)
refsymb = reference symbol
examination/flp/question65.txt · Последние изменения: 2014/01/15 08:17 (внешнее изменение)