Предикат пролога

Здравствуйте, я новичок в Prolog с основным вопросом. Я хотел бы знать, почему эти предикаты Prolog daughter_of/2 и son_of/2 не работают так, как я хочу. Например, если я спрошу

16 ?- daughter_of(alice, X).
true.

(Почему верно? Какой предикат мне нужен, чтобы получить Викторию и Альберта?)

Спасибо.

male(albert).
male(edward).

female(alice).
female(victoria).

parents(edward, victoria, albert).
parents(alice, victoria, albert).

sister_of(X,Y):-
    female(X),
    parents(X,M,F),
    parents(Y,M,F).

brother_of(X,Y):-
    male(X),
    parents(X,M,F),
    parents(Y,M,F).

daughter_of(X,Y):-
    female(X),
    parents(X,M,F).

son_of(X,_Y):-
    male(X),
    parents(X,M,F).

person CompilerSaysNo    schedule 30.04.2014    source источник
comment
Y не появляется нигде в теле вашего предложения предиката daughter_of(X, Y).   -  person lurker    schedule 30.04.2014


Ответы (1)


Проблема в определении вашего предиката doughter_of.

daughter_of(X,Y):-
female(X),
parents(X,M,F).

Должен быть

daughter_of(X,Y):-
female(X),
parents(X,Y,_).

daughter_of(X,Y):-
female(X),
parents(X,_,Y).

Таким образом, параметр Y передается предикату родителей. В противном случае он не будет использоваться (и даже выдает предупреждение при загрузке файла). Тогда пролог может только сказать вам, что X - женщина, а у X есть родители, но фактические родители будут отброшены, потому что M и F не являются выходными параметрами вашего предиката.

Обратите внимание, что я дважды определил предикатaughter_of, чтобы работать как с отцом, так и с матерью.

То же самое и с son_of.

person Laszlo Korte    schedule 30.04.2014
comment
Привет и спасибо. Что вы имеете в виду, когда говорите, что M и F не являются выходными параметрами предиката? В переводе на простой английский, X является дочерью Y, если X - женщина, а родители X - Y и _ (что такое __? И разве Y не объединяется с Викторией? (Для второго предиката Y теперь предлагается объединить с чем-то еще ? (почему бы не дать ему новую переменную?) Еще раз спасибо. - person CompilerSaysNo; 30.04.2014
comment
Я имел в виду, что Y, M / Y и F никогда не объединяются. Когда вы вызываетеaughter_of (alice, X), вы ожидаете, что вывод / результат (Виктория и Альберт) будут объединены с X. Итак, X - ваша выходная переменная. Но внутри вашего предиката M и F никогда не объединяются с Y. M будет объединен со значением Victoria. Вы ожидаете, что X = Victoria, но X не объединен с M. - person Laszlo Korte; 30.04.2014