2013-08-24 1 views
1

После многих лет воздержания от языка программирования PROLOG, я пытаюсь войти в него снова. И быстро, что-то меня смутило.PROLOG - предложение возвращает true для констант, но не найдет решение для переменной?

(я использую SWI пролог 6.4.1 на окнах.)

Рассмотрим следующие определены:

father(jack, clara). 
father(jack, sophie). 

mother(angela,clara). 
mother(angela,sophie). 

parent(A, B) :- father(A, B). 
parent(A, B) :- mother(A, B). 

sibling(A, B) :- 
    A \= B, 
    parent(P, A), 
    parent(P, B). 

Теперь, если я "попросить" переводчика: одноуровневый (Clara, Sophie).

Настоящий является ответом.

Но если я попытаюсь получить братьев и сестер, например. clara: sibling (clara, X).

Ответ только false. Точно так же, как findall (X, sibling (clara, X), L).

возвращает пустой список.

Почему?

+0

'\ =' следует читать как «не может быть объединен с», ** не ** как «нет». Тогда нет никакого искажения любого заявления, которое его использует. –

ответ

3

Чтобы доказать, что sibling(clara, X), сначала необходимо доказать, что clara \= x. Но это не работает, потому что оно сводится к \+ clara = X, были \+ - это пресловутый negation as failure: Пролог пытается доказать clara = X, который успешно завершен, и делает вывод, что clara \= X должен быть ложным.

Вы должны либо изменить порядок своей программы, чтобы выполнить \= проверку последнего вместо первого, либо использовать dif(clara, X).

+0

Это было быстро, я попробую это прямо сейчас :-) Интересно - порядок выступлений имеет значение? Я рассматривал запятую как оператор И. –

+0

@dont ask, Порядок высказываний очень важен в Prolog. Запятая есть фактически и оператор И (и, кстати, оператор OR). Из-за этого порядка некоторые предикаты могут даже не закончиться. Вы можете посмотреть алгоритм унификации, чтобы понять, почему это важно. Кроме того, посмотрите на оператор OR. Это поможет понять. – petermlm

+0

О, и я писал несколько раз несколько раз с разными «телами», чтобы получить эффект ИЛИ. 10 лет назад я писал такие вещи, как алгоритмы поиска дерева в PROLOG, мне интересно, как я узнал так мало тогда, или если я действительно так много забыл :-D Спасибо за указатели. –

Смежные вопросы