これが私のコードです。最後の 3 つのルールに注目してください。
father(costac,anne).
mother(mary,mike).
husband(costac,mary).
sex_male(costac).
sex_male(mike).
sex_female(mary).
sex_female(anne).
mother(X,Y):-
father(Z,Y),
wife(X,Z).
father(X,Y):-
mother(Z,Y),
husband(X,Z).
husband(X,Y):-
wife(Y,X).
wife(X,Y):-
husband(Y,X).
husband(X,Y):-
father(X,Z),
mother(Y,Z).
wife(X,Y):-
father(Y,Z),
mother(X,Z).
brother(X,Y):-
father(Z,Y),
father(Z,X),
sex_male(X),
\+ X = Y.
brother(X,Y):-
mother(Z,Y),
mother(Z,X),
sex_male(X),
\+ X = Y.
sister(X,Y):-
father(Z,X),
sex_female(X),
father(Z,Y),
\+ X = Y.
sister(X,Y):-
mother(Z,X),
sex_female(X),
mother(Z,Y),
\+ X = Y.
find_rel(Ans):-
write('Please give first name: '), read(X),
find(X,Ans).
find(X,Ans):-
write('Would you like to give second name? -yes/no-'), nl, read(Ask), find_ans(Ask,X,Ans).
find_ans(yes,X,Ans):-
write('Please give second name: '), read(Y),nl,
(father(X,Y),!, Ans = father(X,Y));
(mother(X,Y), !,Ans = mother(X,Y));
(husband(X,Y), !,Ans = husband(X,Y));
(wife(X,Y), !,Ans = wife(X,Y));
(brother(X,Y), !,Ans = brother(X,Y));
(sister(X,Y), Ans = sister(X,Y)).
/*find_ans(no,X,Ans):-....*/
他の答えは気にしません。この質問に対する答えだけです。
?-find_rel(Ans).
costac と anne という名前を付けて、欲しいものを手に入れました。なぜなら、それは私のルールの最初の行だからです。私が試みる他のすべては失敗し、タイトルのエラーを与えます! カットを使用してみましたが、何も機能しませんでした。たとえば、私がメアリーとマイクを与えると、トレースすると、ステップに進ん(mother(X,Y), !,Ans = mother(X,Y));
でプロデュースがそれをmother(mary,anne)
無視し、次の2つに進み、そのことをループし続けることがわかります。
Call: (10) father(mary, mike) ? creep
Call: (11) mother(_G1479, mike) ? creep
Exit: (11) mother(mary, mike) ? creep
Call: (11) husband(mary, mary) ? creep
Call: (12) wife(mary, mary) ? creep
Call: (13) husband(mary, mary) ? creep
Call: (14) wife(mary, mary) ? creep
Call: (15) husband(mary, mary) ? creep
Call: (16) wife(mary, mary) ? creep
Call: (17) husband(mary, mary) ? creep
Call: (18) wife(mary, mary) ? creep
Call: (19) husband(mary, mary) ? creep
Call: (20) wife(mary, mary) ? creep
Call: (21) husband(mary, mary) ?