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, "понедельник"]
В Турбо Прологе, в связи со строгой типизацией, все элементы списка должны принадлежать одному домену. Однако можно разместить в одном списке объекты разной природы, используя домен с соответствующими альтернативами.
Пример: Создать список объектов разного типа