2010-11-04 6 views
3

Je veux générer toutes les sous-listes d'une liste donnée avec la propriété donnée qu'elles ont une certaine longueur mentionnée comme argument et elles ont aussi comme élément de contenu un élément donné qui est passé en paramètre. J'ai réussi à le faire, mais avec l'aide de deux prédicats, et en termes de optimalité est très lent:Prolog Question - Comment générer des sous-listes d'une longueur donnée

sublist([], []). 
sublist([A|T], [A|L]):- 
    sublist(T, L). 
sublist(T, [_|L]):- 
    sublist(T, L). 

choose(T, L):- 
    sublist(T, L), 
    (dimension(2, T); dimension(1, T)), 
    belongs(f, T). 

ici, je voudrais revenir par le paramètre T du prédicat choose tous les sous-listes de la L liste qui ont la dimension 2 ou 1 et qui contient l'élément f. Les prédicats dimension et member ont la même utilisation que les prédicats prédéfinis length, respectivement member.

Pouvez-vous me dire comment incorporer ces deux conditions dans le prédicat sublist afin que le programme ne construise que ces sous-listes particulières?

Répondre

2

La suite crée des sous-séquences de longueur MinLen =< Len =< MaxLen. Je ne sais pas pourquoi vous avez renommé length et member, donc je vais utiliser les originaux. sublist/4 appelle votre sublist/2.

sublist(Sub,List,MinLen,MaxLen) :- 
    between(MinLen,MaxLen,Len), 
    length(Sub,Len), 
    sublist(Sub,List). 

Notez que length est appelée sur deux variables, vous obtenez un iterative deepening search. choose/2 peut maintenant être définie comme

choose(Sub,List) :- 
    sublist(Sub,List,1,2), 
    member(f,Sub). 

Ceci est la solution propre. Si ce n'est pas assez rapide, alors roulez toutes les conditions dans un prédicat:

choose(Sub,List), 
    (Sub = [f] ; Sub = [f,_] ; Sub = [_,f]), 
    sublist(Sub,List). 
Questions connexes