Изучите пролог упражнения 2.3 - PullRequest
1 голос
/ 17 сентября 2011

Я прохожу через веб-сайт изучения пролога, чтобы попытаться выучить некоторый пролог, и пытаюсь понять упражнение 2.3.Я предполагаю, что каждый вызов word () идет один в какой-то стек, и это объясняет, почему кажется, что слова меняются от конца к началу.Но почему же он снова возвращается вниз, если немного меняет одно из слов?

Например:

преступник ест преступника

преступник ест большойбургер kahuna

преступник ест каждый преступник

преступник ест каждый большой бургер кахуна

word(article,a).
word(article,every).
word(noun,criminal).
word(noun,'big kahuna burger').
word(verb,eats).
word(verb,likes).

sentence(Word1,Word2,Word3,Word4,Word5) :-
    word(article,Word1),
    word(noun,Word2),
    word(verb,Word3),
    word(article,Word4),
    word(noun,Word5).

Тогда можно задать вопрос на swi-прологе, чтобы он сказал «да / нет» вместо «истина / ложь»?

С наилучшими пожеланиями Андерс Олме

1 Ответ

3 голосов
/ 18 сентября 2011

Позвольте мне немного подробнее рассказать о том, что сказал звездный.

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

Поскольку 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, потому что привязка невозможна.

...