Запись в файл в gprolog - PullRequest
       63

Запись в файл в gprolog

2 голосов
/ 26 апреля 2011

Как записать в файл все решения, полученные из программы пролога?

1 Ответ

4 голосов
/ 26 апреля 2011

Короткий ответ заключается в том, чтобы вставить вызов к вашему предикату «решения» в цикле повтора / сбоя, на предпоследнем шаге которого решение записывается в файл.

Поскольку сообщение короткое наподробности о том, какое решение используется (и, следовательно, насколько сложно может быть написание терминов, например, если желательно иметь возможность восстановить один или несколько терминов после чтения записанного файла в какой-то момент), давайте начнем с простогоиллюстрация, где решения - просто целые числа.

У нас есть следующий недетерминированный предикат:

mySolution(X) :- for(X,1,10).

Примечание для / 3 - это встроенный предикат для GNU Prolog.SWI-Prolog имеет аналогичный предикат между / 3 и Amzi!Пролог имеет для / 4 с дополнительным аргументом, позволяющим инкременту отличаться от +1.Пользовательская реализация будет выглядеть так:

for(Low,Low,High) :- Low =< High.
for(New,Low,High) :-
    Now is Low + 1,
    Now =< High,
    for(New,Now,High).

, так что цель mySolution(X) будет успешно достигнута предсказуемо конечным числом способов.

Вывод файла может быть достигнут либо с использованием GNU-Prolog'sпотоковые факультеты, или путем перенаправления командной строки консольного вывода.Мы проиллюстрируем первую возможность, хотя вторая может быть проще и более гибкой во многих случаях.

main :-
    open('myOutput.txt',write,ID),
    (   ( mySolution(X), write(ID,X), nl(ID), fail )
      ; close(ID)
    ).

Как и во многих реализациях Prolog, GNU-Prolog предлагает несколько потоковых и непотоковых вариантов на напишите предикат, и вы можете найти здесь соответствующую документацию .Для открыть и закрыть посмотреть эту ссылку и эту ссылку .

Добавлено: Я добавил nl / 1 вызов для разделения решений в выходном файле.

...