Пролог Создание списка - PullRequest
0 голосов
/ 26 апреля 2011

Я пытаюсь создать список из фактов:

mother(jane,jerry).
mother(susan,riche).
mother(helen,kuyt).

Я хочу преобразовать имена матерей в список, содержащий несколько элементов, например:

momlist([jane,susan],2).
momlist([jane,susan,helen],3).
momlist([jane],1).

Я пытался создать это с помощью:

momlist(X,Number):- mom(X,_),
NewNum is Number-1,
NewNum > 0,
write(x),
momlist(X,NewNum).

Это просто написать число раз имена мамы ..

Как мне составить список с этим фактом?

С наилучшими пожеланиями и большое спасибо.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Вот оно

mother(jane,jerry).
mother(susan,riche).
mother(helen,kuyt).
mother(govno,mocha).
mother(ponos,albinos).

momlist( X, L ) :-
    length( X, L ),
    gen_mum( X ),
    is_set( X ).

gen_mum( [] ).
gen_mum( [X|Xs] ) :-
    mother( X, _ ),
    gen_mum( Xs ).

Итак

?- momlist(X, 3).
X = [jane, susan, helen] ;
X = [jane, susan, govno] ;
X = [jane, susan, ponos] ;
X = [jane, helen, susan] ;
X = [jane, helen, govno] ;
X = [jane, helen, ponos] ;
X = [jane, govno, susan] ;

А

?- momlist(X, 2).
X = [jane, susan] ;
X = [jane, helen] ;
X = [jane, govno] ;
X = [jane, ponos] ;
X = [susan, jane] ;
X = [susan, helen] ;
X = [susan, govno] ;
X = [susan, ponos] ;
X = [helen, jane] ;

Это то, что вы хотите?

0 голосов
/ 30 мая 2017

Пара мелких проблем с принятым ответом:

  1. Добавление второго ребенка для матери (например, матери (helen, todd).) Даст двойные результаты.
  2. gen_mum дает много результатов, которые отклоняются, потому что они не являются множеством (например, X = [jane, jane, jane]; X = [jane, jane, helen]].

Другое возможное решение будет:

momlist(X,L):-
    setof(M, C^mother(M,C), AllMoms),
    perm(L, AllMoms, X).

perm(0, _, []):- !.
perm(N, From, [H|T]):-
    select(H, From, NewFrom),
    NewN is N-1,
    perm(NewN, NewFrom, T).

Также, если вы не хотите, чтобы [jane, helen], а также [helen, jane] и т. Д. Тогда вы можете использовать подмножество вместо perm:

subset(0,_,[]):- !.
subset(N, [M|TM], [M|T]):-
    NewN is N-1,
    subset(NewN, TM, T).
subset(N, [_|TM], L):-
    subset(N, TM, L).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...