Позвольте мне немного подробнее рассказать о том, что сказал звездный.
Логически, эта программа говорит, что любой набор из пяти вещей является предложением, если первое - это статья, второе - это существительное, третье - это глагол, четвертая вещь - это еще одна статья, ипятое - другое существительное.Волшебство Пролога состоит в том, что вам не нужно сообщать ему как , чтобы получить ответ, например: "попробуйте каждую статью для первого слова, затем выполните цикл, пробуя каждое существительное для второго слова и так далее«;вместо этого вы просто декларативно заявляете о своей проблеме (первое слово - это статья и т. д.), и Пролог выяснит это.Поэтому, если ваш вопрос сформулирован логически, вы должны (в конечном итоге) получить все возможные правильные ответы.
Поскольку Prolog работает на реальном компьютере, у него должна быть реальная стратегия поиска ответов и эта стратегия Поиск в глубину : он связывает каждую переменную по очереди, пробует каждую возможность, пока не сможет объединить эту переменную, а затем переходит к следующей переменной.Когда вы запрашиваете следующее решение, оно копирует последнее объединение, у которого были другие возможности, и пытается найти другое, удовлетворяющее предикату.Вот почему сгенерированные предложения выходят в том порядке, в котором они были: слово 5 объединено последним, поэтому, когда Пролог выполняет резервное копирование, он повторяет слово 5. Когда он исчерпывает все возможные объединения для слова 5, он резервирует к слову 4, а затем перемещаетсяПерейдите снова к слову 5. Так что в конце концов он попробует все возможности для всех пяти слов.Если вам не нравится порядок, в котором он пытается, вы можете изменить порядок, в котором вы связываете переменные.Например, если вы хотите, чтобы он повторил первое слово, а затем второе, вы можете переписать программу следующим образом:
sentence(Word1,Word2,Word3,Word4,Word5) :-
word(noun,Word5),
word(article,Word4),
word(verb,Word3),
word(noun,Word2),
word(article,Word1).
?- sentence(X,Y,Z,Q,A), write([X,Y,Z,Q,A]).
[a,criminal,eats,a,criminal] ;
[every,criminal,eats,a,criminal] ;
[a,big kahuna burger,eats,a,criminal]
В соответствии с вашими ожиданиями, это внутренне управляется стеком.Большинство современных прологов реализованы с помощью техники, называемой WAM, абстрактной машиной Уоррена.WAM похож на большинство других виртуальных машин на языке программирования в том, что существует стек вызовов , но есть также второй стек, называемый trail , в который он помещает переменные при каждой привязке.Возврат затем работает, выталкивая последнюю переменную из следа и пытаясь объединить ее и возобновить оттуда.Если для этой переменной нет другого объединения, она выталкивает другую переменную из стека и создает резервную копию дальше.Когда у Пролога кончается след, он просто возвращает false, потому что привязка невозможна.