2016-10-13 2 views
1

la notation Prolog du préfixe/suffixe est assez simple: Il met à peu près tout le travail sur append. Pour ceux qui ne connaissent pas:Obtenir les "vrais" préfixes/suffixes/infixes dans Prolog

prefix(P,L):-append(P,_,L). 
suffix(S,L):-append(_,S,L). 

Maintenant, cela signifie que le résultat pour prefix(X,[a,b,c,d]). sera: X=[];X=[a];X=[a,b];X=[a,b,c];X=[a,b,c,d]

Voici mon problème: je veux un préfixe « réel ». Par conséquent, un préfixe ne peut pas être vide, et la partie qui le suit ne peut pas être vide. donc le résultat à la requête prefix(X,[a,b,c,d]). doit être

X=[a];X=[a,b];X=[a,b,c] 

et c'est tout.

Malheureusement, le vrai Beaty de la norme construite dans prédicat préfixe est, qu'il peut utiliser la fin de append, qui est append([],Y,Y). il est donc assez facile de savoir quand arrêter, choisir la liste à part un par un jusqu'à ce que la liste soit vide. Ma terminaison signifie: Arrêtez s'il reste exactement un élément dans votre liste. Comment est-ce que je fais ceci?

Mon résultat serait naïf:

prefix(P,L):- 
length(P,1),append(P,E,L),E/=[]. 

Cela se sent mal bien. Je suis au travail donc je n'ai pas vérifié si cela fonctionne réellement, mais il devrait:

Existe-t-il un moyen plus pratique de le faire? va de même pour suffixe, qui sera encore plus difficile puisque vous ne disposez pas d'un moyen d'adresse la queue aussi précis que le chef, je suppose que je venais juste inverser la chose, puis appeler le préfix là-dessus.

Infix sera juste une combinaison de deux.

J'espère que ce que je veux dire est clair. Merci pour votre contribution! tl; dr: Comment écrire un préfixe prédicat/2 qui filtre uniquement préfixes réels, de sorte que le préfixe lui-même ne peut être vide, ni la liste suivie par celle-ci est vide.

Répondre

4

Pour le préfixe réel, vous pouvez essayer de le faire comme ceci:

list_prefix(List, [H|T]) :- 
    append([H|T], [_|_], List). 

Cela dit juste que le premier argument doit avoir au moins un élément, et le reste de la liste doit avoir au moins un élément.

Et suite à la suggestion de @false pour le rendre plus explicite:

list_real_prefix(List, Prefix) :- 
    Prefix = [_|_], 
    Rest = [_|_], 
    append(Prefix, Rest, List). 

Le suffixe « réel » sera exactement le même:

list_real_suffix(List, Suffix) :- 
    Front = [_|_], 
    Suffix = [_|_], 
    append(Front, Suffix, List). 
+3

pas besoin de 'H' et' T' – false

+0

Merci pour votre réponse. Je ne peux guère garder les yeux ouverts, je vais répondre à nouveau bientôt. J'ai besoin de me reposer un moment - juste pour m'assurer que tu ne te sens pas oublié :) – InDaPond

4

Vous pouvez également utiliser un DCG pour cette , qui est descriptive:

list_prefix(P) --> non_empty_seq(P), non_empty_seq(_). 
non_empty_seq([X]) --> [X]. 
non_empty_seq([X|Xs]) --> [X], non_empty_seq(Xs). 

| ?- phrase(list_pref(P), [a,b,c,d]). 

P = [a] ? a 

P = [a,b] 

P = [a,b,c] 

no 
| ?- 

Vous pouvez définir le suffixe similaire:

list_suffix(S) --> non_empty_seq(_), non_empty_seq(S).