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

Здравейте, аз съм начинаещ в 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 не са изходни параметри на вашия предикат.

Забележете, че дефинирах предиката на дъщерята два пъти, за да работи както с бащата, така и с майката.

Същото важи и за 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 никога не са унифицирани. Когато извикате daughter_of(alice, X), очаквате изходът/резултатът (Виктория и Албърт) да бъде обединен с X. Така че X е вашата изходна променлива. Но във вашия предикат M и F никога не се обединяват с Y. M ще бъде обединен със стойността Victoria. Очаквате X=Виктория, но X не е обединен с M. - person Laszlo Korte; 30.04.2014