List Prolog创建一个列表

List Prolog创建一个列表,list,prolog,List,Prolog,我试图根据事实创建一个列表: 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, NewNu

我试图根据事实创建一个列表:

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).
它只写了妈妈名字的倍数

我怎样才能列出这些事实

致以最诚挚的问候和感谢。

给您

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 ).
所以


这就是你想要的吗?

关于公认的答案,有几个小问题:

  • 为母亲(例如母亲(helen,todd))添加第二个孩子将产生重复的结果
  • 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]等,则可以使用subset而不是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).
    

    对不起,我真的不明白你在问什么。首先,
    mom
    的含义是什么?通常作为一个母亲是两个实体(母亲和孩子)之间的关系,第三个名字是什么?第二个困惑点:你称之为
    momlist
    ,我称之为
    length
    ,除非我遗漏了什么。或者你想要一种收集所有妈妈的方法吗?(在这种情况下,为什么要用length这个词来搅浑水呢)什么是,突然间,
    directorList
    ?我很抱歉,我更正了..是的,我想收集列表中的所有妈妈..但是有一个数字限制..例如,如果目标是momlist(X,2)。它将首先给出:[jane,susan]在[jane,helen]之后在[susan,helen]之后在[susan,jane]之后在[helen,jane]之后在[helen,jane]之后在[helen,susan]之后
    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).
    
    subset(0,_,[]):- !.
    subset(N, [M|TM], [M|T]):-
        NewN is N-1,
        subset(NewN, TM, T).
    subset(N, [_|TM], L):-
        subset(N, TM, L).