Fact(0,1)

fact(K,F):-K1=K-1, fact(K1,F1), F=F1*K.

Введем запрос:

Goal: fact(0,X), write(”X= ”,X), nl, fail.

Получим Х=1, и процесс зациклится, так как Пролог пытается сделать попытку сопоставить fact(0,X) со вторым утверждением:

fact(K,F):-…

Сопоставление будет успешным, и теперь он попытается доказать цель fact(0,F1), что в свою очередь приводит к цели fact(-1,F1) и т.д.

Можно устранить такие ситуации, используя отсечение, при этом указывая Прологу, что не существует других решений в случае успешного согласования граничного условия.

fact(0,1):-!.

fact(K,F):-K1=K-1, fact(K1,F1), F=F1*K.

Введем запрос:

Goal: fact(0,X), write(”X= ”,X), nl, fail.

Получим единственное решение.

При использовании отсечения возможно, что отсечение исключит необходимые альтернативы или отсечение разрушит декларативное восприятие программы.

Списки

Список – упорядоченная последовательность элементов произвольной длины.

Список задается перечислением элементов списка через запятую в квадратных скобках.

Пример: Варианты списков

[monday, tuesday, wednesday, thursday, friday, saturday, sunday] — список, элементами которого являются английские названия дней недели;

[1, 2, 3, 4, 5, 6, 7] — список, элементами которого являются номера дней недели;

['п', 'в', 'с', 'ч', 'п', 'с', 'в'] — список, элементами которого являются первые символы русских названий дней недели;

[] — пустой список, т.е. список, не содержащий элементов.

Элементы списка могут быть любыми, в том числе и составными объектами. В частности, элементы списка сами могут быть списками.

В разделе описания областей определения списки описываются следующим образом:

Domains

<имя спискового домена>=<имя домена элементов списка>*

Звездочка после имени домена указывает на то, что задается список, состоящий из объектов соответствующего типа.

Пример:

listI = integer* /* список, элементы которого — целые числа */

listR = real* /* список, состоящий из вещественных чисел */

listC = char* /* список символов */

lists = string* /* список, состоящий из строк */

listL = listI* /* список, элементами которого являются списки целых чисел */

Последнему примеру будет соответствовать список вида:

[ [1,3,7] , [] , [5,2,94] , [–5,13] ]

В классическом Прологе элементы списка могут принадлежать разным доменам, например: [monday, 1, "понедельник"]

В Турбо Прологе, в связи со строгой типизацией, все элементы списка должны принадлежать одному домену. Однако можно разместить в одном списке объекты разной природы, используя домен с соответствующими альтернативами.

Пример: Создать список объектов разного типа

Наши рекомендации