ЗНАЙ ИНТУИТ, Лекция, Контрол на груба сила

3.3. Findall предикат и [... || ...]

Предикатът findall/3 събира стойностите на параметрите в списък. Първият му аргумент е изчислен параметър, вторият е предикатът, от който е намерен, а третият е името на променлива, която обозначава списък със стойности на параметрите. Обобщение на тази конструкция е конструкцията [... || ...]. Тази конструкция съответства в математиката на задаване на набор с помощта на дефиниращо свойство, например във формата, където и са някои множества. По-долу са дадени примери за използване на предиката на findall и [… || ...] .

Намери всички родители:

  1. findall (X, родител (X, _), Списък);
  2. Списък = [X || родител (X, _)].

Намери всички хора:

  1. findall (X, (мъжки (X); женски (X)), Списък);
  2. Списък = [X || мъжки (X); женски (X)].

Декартов продукт на много мъже и много жени:

Намерете резултата от извикването на последната цел (декартов продукт), ако наборът от факти изглежда така:

Обърнете внимание на реда на елементите в списъка .

3.4. Режими на предикатния детерминизъм

Декларирането на режимите на детерминизъм ви позволява да организирате изчисленията по-икономично. Така че, ако не е необходимо връщане назад за изчисления, няма нужда да задавате точки за връщане. Тази характеристика на предиката е маркирана със специална ключова дума. Това спестява памет и прави изчисленията по-бързи.

Режимът на детерминизъм се определя от броя на възможните решения при извикване на предиката (т.е. дали е необходимо връщане назад) и дали може да се провали. Ключовите думи, използвани за обозначаване на режимите на детерминизъм, са изброени в таблица. 3.1.

Компилаторът на Visual Prolog автоматично изчислява режима на детерминизъм на предиката, като го дефинира в програмата и информира потребителя за грешка, ако декларираният режим на детерминизъм на предиката не съответства на действителната дефиниция на предиката. Понякога се ограничава до предупреждение.