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

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


examination:flp:question55

Содержание

flush

Предикат flush записывает содержимое внутреннего буфера в именованный файл. Он имеет формат.

 flush(SymbolicFileName) % (i)

Он же запрашивает систему «сбросить все буферы».

frontchar

Предикат frontchar действует согласно равенству:

    String1 = объединение Char и String2 

и имеет следующий формат:

 frontchar(String1,Char,String2) %(i,o,o) (i,i,о) (i,o,i) (i,i,i) (o,i,i)

Предикат frontchar имеет три аргумента: первый из них - строка, второй - симвoл (первый символ первой строки), третий - остаток первой строки.

Предикат frontchar можно использовать для расщепления строки в последовательность символов или для создания строки из последовательности символов, а также проверки символов в строке. Если аргумент String1 связан со строкой нулевой длины, то предикат завершается неуспешно.

В следующей программе frontchar используется для определения предиката, преобразующего строку в список символов.

   Задайте цель: 
 string_chlist("ABC",Z)
   После обработки этого целевого утверждения Z будет связано со списком ['A','В','С']. 
 domains
    charlist=char*
 predicates
    string_chlist(string,charlist)
 clauses
    string_chlist("",[ ]):-!.
    string_chlist(S,[H |T]):-
       frontchar(S,H,S1),
       string_chlist(S1,T).
      

forward

Действие этих предикатов зависит от следующих факторов: направление движения, рисует «перо» или нет (активизировано ли оно), цвет пера.

Стандартный предикат pendown (перо вниз) активизирует перо, а предикат penup (перо вверх) приводит его в пассивное состояние. После вызова предиката graphics перо активизировано. Цвет следа определяется параметром предиката pencolor.

Движение пера управляется четырьмя стандартными предикатами: forward (вперед), back (назад), right (вправо), left (влево). Например, предикат forward (Step) показывает, на сколько шагов должно переместиться перо. Чтобы повернуть перо вводится переменная Angle (Угол). Угол измеряется в градусах. Например, right(Angle) поворачивает перо вправо.

Приведем тексты программ, реализующих некоторые графические объекты:

Треугольник

 goal
    graphics(2,1,0),
    pendown,
    forward(5000), right(120),
    forward(5000), right(120),
    forward(5000), right(120).

Звезда

 goal
    graphics(2,1,0),
    forward(5000), right(144), forward(5000), right(144),
    forward(5000), right(144), forward(5000), right(144),
    forward(5000), right(144), forward(5000).

Текст этой программы можно взять здесь.

Окружность

 predicates
   circle1
 goal
   graphics(2, 1, 0),
   circle1.
 clauses
   circle1:-
      forward(100), right(4), circle1. 
     

findall

Преимущество рекурсии состоит в том, что, в отличие oт поиска с возвратом, она передает информацию (через параметры) от одного рекурсивного вызова к следующему. Поэтому рекурсивная процедура может хранить память о промежуточных результатах или счетчиках по мере того, как она выполняется.

Но есть одна вещь, которую поиск с возвратом может делать, а рекурсия - нет. Это поиск всех альтернативных решений в целевом утверждении. Может оказаться, что вам нужны все решения для целевого утверждении, и они необходимы все сразу, как часть единой сложной составной структуры данных. Встроенный предикат использует целевые утверждения в качестве одного из своих аргументов и собирает все решения для этого целевого утверждения в единый список. У предиката findall три аргумента: varName(имя переменной) - определяет параметр, который необходимо собрать в список; myPredicate (мой предикат) - определяет предикат, из которого надо собрать значения; ListParam (список параметров) - содержит список значений, собранных методом поиска с возвратом. Заметьте, что должен быть определенный пользователем тип, которому принадлежат значения ListParam. Следующая программа использует findall для печати среднего возраста группы людей.

 domains
    name,address=string
    age=integer
    list=age*
 predicates
    person(name,address,age)
    sumlist(list,age,integer)
 clauses
    sumlist([],0,0).
    sumlist([H |T],Sum,N):-
       sumlist(T,S1,N1),
       Sum=H+S1,
       N=1+N1.
    person("Sherlock Holmes","22B Baker Street",42).
    person("Pete Spiers","Apt. 22, 21st Street", 36).
    person("Mary Darrow", "Suite 2, Omega Home", 51).
 goal
    findall(Age,person(_, _, Age),L), 
    sumlist (L,Sum,N), 
    Ave=Sum/N,
    write("Average=", Ave),nl.

Предложение findall в этой программе создает список L, в котором собраны все возвраты, полученные из предиката person. Если бы вы захотели собрать список из всех людей, которым 42 года, то вам следовало бы выполнить следующее подцелевое утверждение:

 findall(Who,person(Who,_,42),List)

Но эта подцель требует от программы, чтобы та содержала объявление домена для результирующегo списка:

 slist=string* 
examination/flp/question55.txt · Последние изменения: 2014/01/15 08:17 (внешнее изменение)