Неопределенная процедура в SWI-Prolog не работает - PullRequest
4 голосов
/ 10 мая 2011

Я только начинаю использовать Пролог, и уже столкнулся с проблемой, казалось бы, простого примера.Вот мой файл .pl:

hacker(P) :- mountaindew(P), doesntsleep(P).
hacker(P) :- writesgoodcode(P).
writesgoodcode(jeff).

Затем, после загрузки программы в swipl, я проверяю ее с помощью этой строки в приглашении

writesgoodcode(jeff).

Я думал, что будет отображаться true, но я получаю эту ошибку:

?- hacker(jeff).
ERROR: hacker/1: Undefined procedure: mountaindew/1
   Exception: (7) hacker(jeff) ? 

Эта программа работает нормально, но это не решает мои проблемы:

hacker(P) :- writesgoodcode(P).
writesgoodcode(jeff).

$ swipl -s dumb.pl
% dumb.pl compiled 0.00 sec, 1,112 bytes

?- hacker(jeff).
true.

Может кто-нибудь объяснить, почему моя оригинальная программа не работает?Насколько я понимаю, Пролог должен «пропустить» первое утверждение, поскольку в нем недостаточно информации, и проверить следующую строку.У достаточно информации для этой второй строки, и поэтому он должен иметь значение true.Любая помощь или точка в правильном направлении было бы здорово.Спасибо.

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

Как говорится в сообщении об ошибке, у вас есть неопределенная процедура mountaindew/1.Чтобы ваш код возвращал значение true, можно указать следующие параметры:

  1. Определить этот предикат
  2. Объявить, что этот предикат является динамическим: dynamic(mountaindew/1)
  3. Объявить все неизвестные предикатыдолжен потерпеть неудачу (не рекомендуется): set_prolog_flag(unknown, fail)
0 голосов
/ 23 июля 2012

Это работает, но, поскольку я новичок, я не могу сказать, почему. Слово «необоснованный» может применяться. Несмотря на то, что не знает, почему это работает, я думаю, что полезно показать один способ, который работает.

hacker(P) :- mountaindew(P), doesntsleep(P).
hacker(P) :- writesgoodcode(P).
mountaindew(john).
doesntsleep(john).
writesgoodcode(jeff).
0 голосов
/ 10 мая 2011

Вы также можете изменить порядок предикатов (это не всегда может быть сделано), но в основном то, что сказал Каарел.

В конце нет смысла писать что-то, что всегда будет неудачным, даже есливы все еще разрабатываете код

...