Укажите количество отростков в прологе - PullRequest
0 голосов
/ 24 декабря 2018

Я нашел код, который создает генеалогическое древо и настраивает некоторые отношения, такие как отец, мать, сын и т. Д., Но я хочу добавить еще одну функцию, которая подсчитывает количество всех потомков кого-либо.

Может кто-нибудь помочь мне с этим?

Понятия не имею, с чего начать.

mother(teresa,ireneusz).
mother(teresa,beata).
sex(teresa,k).

son(X,Y) :- 
  sex(X,m), 
  father(Y,X),
  X\=Y.

son(X,Y) :- 
  sex(X,m), 
  mother(Y,X),
  X\=Y.

daughter(X,Y) :- 
  sex(X,k), 
  father(Y,X),
  X\=Y.

daughter(X,Y) :-
  sex(X,k),
  mother(Y,X),
  X\=Y.

kid(X,Y) :-  
  father(Y,X),
  X\=Y.

kid(X,Y) :- 
  mother(Y,X),
  X\=Y.

parent(X,Y) :- 
  kid(Y,X),
  X\=Y.

siblings(X,Y) :- 
  parent(Z,X),
  parent(Z,Y),
  X\=Y,
  X\=Z,
  Y\=X.

brat(X,Y) :- 
  sex(X,m),
  parent(Z,X),
  parent(Z,Y),
  X\=Y,
  X\=Z,
  Y\=X.

siostra(X,Y) :- 
  sex(X,k),
  parent(Z,X),
  parent(Z,Y),
  X\=Y,
  X\=Z,
  Y\=X.

wuj(X,Y) :- 
  mother(Z,Y),
  brat(X,Z),
  X\=Y,
  X\=Z,
  Y\=Z.

stryj(X,Y) :- 
  father(Z,Y),
  brat(X,Z),
  X\=Y,
  X\=Z,
  Y\=Z.

ciotka(Y,X) :- 
  mother(Z,X),
  siostra(Y,Z),
  X\=Y,
  X\=Z,
  Y\=Z.

ciotka(Y,X) :- 
  father(Z,X),
  siostra(Y,Z),
  X\=Y,
  X\=Z,
  Y\=Z.

babcia(B,A) :- 
  parent(C,A),
  parent(B,C),
  sex(B,k),
  A\=B,
  A\=C,
  B\=C.

grandfather(B,A) :- 
  parent(C,A),
  parent(B,C),
  sex(B,m),
  A\=B,
  A\=C,
  B\=C.

wife(X,Y) :- 
  sex(X,k),
  kid(Z,X),
  kid(Z,Y),
  X\=Y,
  X\=Z,
  Y\=Z.

husband(X,Y) :- 
  sex(X,m),
  kid(Z,X),
  kid(Z,Y),
  X\=Y,
  X\=Z,
  Y\=Z.

cousin(X,Y) :- 
  sex(X,m),
  kid(X,Z),
  wuj(Z,Y),
  X\=Y,
  X\=Z,
  Y\=Z.

scion(X,Y) :- 
   parent(Y,X).

scion(X,Y) :- 
   parent(Z,X),
   scion(Z,Y).

ancestor(X,Y) :- 
  kid(Y,X).

ancestor(X,Y) :- 
  kid(Z,X),
  ancestor(Z,Y).

relative(X,Y) :- 
  kid(X,Y);
  parent(X,Y);
  cousin(X,Y);
  babcia(X,Y);
  grandfather(X,Y),
  X\=Y.                    

  kid(X,Y);
  parent(X,Y);
  cousin(X,Y);
  babcia(X,Y);
  grandfather(X,Y),
  X\=Y.

1 Ответ

0 голосов
/ 24 декабря 2018

У вас есть два варианта:

  1. В SWI Prolog вы можете использовать предикат aggregate_all:

aggregate_all(count, scion(X,teresa), Count).

Вы можете определить свой собственный предикат, который подсчитывает все возможные решения:

count(P,Count) :- findall(1,P,L) , length(L,Count). %and now use your predicate count(scion(X,teresa),X).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...