2015-12-21 2 views
2
woman(lisa). 
woman(maggie). 

parents(lisa , homer, marge). 
parents(maggie, homer, marge). 

sister(X, Y) :- 
    X \= Y, 
    woman(X), 
    parents(X, P, M), 
    parents(Y, P, M). 

Когда я запустил следующий запрос, я не ожидал отказа (но получил его тем не менее).Почему эта прологовая программа возвращает false?

?- sister(lisa, X). 
false.       % expected result: X = maggie 

Почему я вижу это поведение?

+0

'(\ =)/2' не является чисто логическое отношение. Вместо этого используйте чистый предикат 'dif/2'. Проблема с '(\ =)/2' в двух словах:'? - X \ = Y, X = a, Y = b.' дает ** false **, но 'X = a, Y = b, X \ = Y' ** преуспевает **. – mat

ответ

1

Предполагая, что sister(X,Y) говорит, что Y является сестрой X, вы хотите woman(Y), не woman(X).

перестановка правила делает его работу (demo):

sister(X, Y):- 
    woman(Y), 
    parents(X, P, M), 
    parents(Y, P, M), 
    X \= Y. 

Важны в этом переустройстве является то, что X \= Y термин перемещается в точку после обоего X и Y было оценки - X предоставляется правилу в качестве входных данных, а Y связан посредством участия в woman(Y).

+0

@ManuelW. Он не должен быть последним, он может быть вторым (сразу после «woman (Y)» - [demo] (http://ideone.com/P8v8Lg)). Важно то, что перед проверкой неравенства 'Y' необходимо * привязать *. – dasblinkenlight

1

Оставайтесь чистыми! Как? Используйте для выражения срочного неравенства!

 
sister(X, Y) :- 
    dif(X, Y), 
    woman(X), 
    parents(X, P, M), 
    parents(Y, P, M). 

Пример запроса:

?- sister(lisa, X). 
X = maggie. 

Для более на dif/2 Смотри также:

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