КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
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, "понедельник"] В Турбо Прологе, в связи со строгой типизацией, все элементы списка должны принадлежать одному домену. Однако можно разместить в одном списке объекты разной природы, используя домен с соответствующими альтернативами. Пример. Создать список объектов разного типа
|