Короткий ответ заключается в том, чтобы вставить вызов к вашему предикату «решения» в цикле повтора / сбоя, на предпоследнем шаге которого решение записывается в файл.
Поскольку сообщение короткое наподробности о том, какое решение используется (и, следовательно, насколько сложно может быть написание терминов, например, если желательно иметь возможность восстановить один или несколько терминов после чтения записанного файла в какой-то момент), давайте начнем с простогоиллюстрация, где решения - просто целые числа.
У нас есть следующий недетерминированный предикат:
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 вызов для разделения решений в выходном файле.