0

これが私のコードです。最後の 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) ? 
4

0 に答える 0