top-shop.ru
Nouba Тональная основа
Выдать все решения задачи "общим списком"

Первые шаги в GNU Prolog.

Простейшая программа на Прологе, которая показывает, как вывести весь список решений (без остановки после каждого X):
like(smit, bread).
like(jhon, bread).
like(jerry, milk).

who_like_bread :-
 write('They like bread:'),
 nl,
 like(A, bread),
 write(A),
 nl,
 fail.
Перечисление целей через запятую [,] объединяет их по принципу И (т.е. все они должны выполниться). Возможно перечисление по принципу ИЛИ - тогда разделителем была бы точка с запятой [;]. Загрузим программу и запросим список решений:
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- ['like'].
compiling E:\Prolog\Program\1\like.pl for byte code...
E:\Prolog\Program\1\like.pl compiled, 4 lines read - 883 bytes written, 10 ms

yes
| ?- who_like_bread.
They like bread:
smit
jhon

(10 ms) no
| ?-
Аналогично, можно сохранить список решений в файл, на диск компьютера (например, в текущий каталог):
GNU Prolog 1.2.16
By Daniel Diaz
Copyright (C) 1999-2002 Daniel Diaz
| ?- ['like'].
compiling E:\Prolog\Program\1\like.pl for byte code...
E:\Prolog\Program\1\like.pl compiled, 5 lines read - 1365 bytes written, 10 ms

(10 ms) yes
| ?- listing.

like(smit, bread).
like(jhon, bread).
like(jerry, milk).

file_who_like_bread :-
 tell('result.txt'),
 write('They like bread:'),
 nl,
 like(A, bread),
 write(A),
 nl,
 fail,
 told.

who_like_bread :-
 write('They like bread:'),
 nl,
 like(A, bread),
 write(A),
 nl,
 fail.

(10 ms) yes
| ?- file_who_like_bread.

no
| ?- 
Предикат tell('result.txt') переключает стандартный вывод с консоли на файл, а told - возвращает его консоли.
Блог изучающего Пролог

содержание