Я работаю над программой, которая проверяет, может ли человек стать гражданином или нет. Когда человек в базе данных передается, он должен возвращать все причины, по которым они делают или не квалифицируются. Моя проблема заключается в том, что, чтобы показать все причины, я использую неспособность отступить и найти другие причины, это делает ложным возвращение, когда это должно быть правдой.Проблемы с ошибкой и возвратом
born(frank,usa,1944).
child(frank,mary,jack).
child(mary,sean,ruth).
born(fiona,usa,1920).
child(fiona,sean,ruth).
citizen(X):- born(X,'irl',_).
natcitizen(X):-naturalized(X,_).
marriedirl(X):-married(X,Y,_),born(Y,'irl',_).
adoptedirl(X):-adopted(X,P1,P2),born(P1,'irl',_),born(P2,'irl',_).
irlparent(X):-child(X,P1,P2),(born(P1,'irl',_);born(P2,'irl',_)).
irlgrandparent(X):- child(X,P1,P2),(child(P1,G1,G2),(born(G1,'irl',_);born(G2,'irl',_));child(P2,G3,G4),(born(G3,'irl',_);born(G4,'irl',_))).
permres5(X):-(permres(X,Start,End),born(X,_,B),A is B, [email protected]>=18,End==2015,N is End-Start,([email protected]>=5)).
qualify(X):- \+(citizen(X) ->write(X) ->write_ln(' is already an irish born citizen')), \+ (natcitizen(X) ->write(X) ->write(' is already a naturalized Irish citizen')),
(marriedirl(X)->write(X) ->write_ln(' qualifies: he/she is married to an Irish citizen'));
(adoptedirl(X))->write(X) ->write_ln(' qualifies: he/she was adopted by Irish-born parents');
(irlparent(X)->write(X) ->write_ln(' qualifies: he/she has an Irish parent')),fail;
(irlgrandparent(X) ->write(X) ->write_ln(' qualifies: he/she has an Irish grandparent')),fail;
(permres5(X) ->write(X) ->write_ln(' qualifies: he/she is an Irish permanent resident and has been for at least 5 years')),fail.
Так что, когда Фиона называется: Фиона квалифицирует: он/она имеет ирландский родитель ложного. возвращается вместо true.
для откровенного его: откровенных квалифицируется: он/она имеет ирландский родитель откровенные квалифицирует: он/она имеет ирландский прародитель ложного.
снова он должен сказать правду, я не уверен, как изменить значение истины, не меняя неудачи, и нарушая обратный путь.
Pastebin из всего кода: http://pastebin.com/tp7Mi5s6
возможно, просто write_ln должно быть написано – CapelliC