Skip to content

Instantly share code, notes, and snippets.

@disolovyov
Created September 8, 2011 21:13
Show Gist options
  • Select an option

  • Save disolovyov/1204745 to your computer and use it in GitHub Desktop.

Select an option

Save disolovyov/1204745 to your computer and use it in GitHub Desktop.
Функционально-логическое программирование. Практика 1.
hostname(X). % при каком X предикат hostname будет верным высказыванием
system(cls). % предикат будет верным, если команда выполнилась
% . — закончить ввод
% ; — ещё варианты вывода («мне не годится»)
notepad. % ввести код через текстовой редактор
% нельзя менять имя файла — пролог запутается
% последний перевод строки обязателен
% в блокноте:
% comment
it(works).
it(works). % yes
it(X).
% программа на прологе — это, скорее, база данных, чем программа
% консоль — это режим запроса, там нельзя так просто дополнять базу данных
% соответственно, нельзя создать новый предикат
X. % ошибка: X может быть чем угодно
X=it(Y),X. % при каком X это выражение будет верным
assert(it(is(good))). % it нужно объявить в базе как динамический предикат
assert(y). % y автоматически становится динамическим
y.
% в блокноте:
:-[mylib]. % подключить другой файл в этот файл
% практически все слова — наши собственные
% от пролога только скобки и точки
% факты о родительстве
parent(alexander,anatoly).
parent(vera,anatoly).
parent(alexander,mari).
parent(vera,mari).
parent(galina,alexander).
% факты о поле
man(anatoly).
man(alexander).
woman(mari).
woman(vera).
woman(galina).
parent(man(X),anatoly). % не сопоставится ни с одним термом в базе
parent(X,anatoly).
parent(X,anatoly),(man(X);woman(X)). % несколько условий с «или»
parent(X,anatoly),man(X);woman(X). % женщины найдутся отдельно
woman(X),not(parent(X,anatoly)).
parent(alexander,X).
parent(alexander,_). % когда нас не интересует конкретный ответ; чёрная дыра
% в блокноте (добавляя к предыдущему):
human(X) :- man(X);woman(X). % X считается human, если ...
parent(X) :- parent(X,_).
not(parent(X)). % сломается, потому что not
% не умеет ничего делать с открытыми термами
% нужен основной (ground) терм
human(X),not(parent(X)).
findall(X,parent(X),L). % верно ли, что L является списком всех X,
% для которых верно parent(X), в порядке нахождения
findall((X,Y),(parent(X,Y),man(X)),L).
setof(X,parent(X),L). % как и findall/3, но без повторений
% на следующую практику/лабораторную сделать предикаты:
% mother(X,Y) :- parent(X,Y),woman(X).
% father(X,Y) :- X является отцом Y
%
% и по такому же приницпу:
% father/2, grandmother/2, grandfather/2,
% sister/2, brother/2, daughter/2, son/2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment