J'essaye d'écrire un prédicat binaire pour prendre une liste, calculer le mod 5 pour chaque élément et le mettre dans une autre liste. Jusqu'à présent, je l'ai fait,Listes de prologues et manipulation de listes
mod5(X,L):- R = [], modhelper(R,L), write(R).
modhelper(X,L):- memb(E,L), mod2(E,Z), addtolist(Z,X,X), modhelper(X,L).
%Get an element from the list L.
memb(E,[E|_]).
memb(E,[_|V]):- memb(E,V).
%If element is integer, return that integer mod 5 else return as is.
mod2(N,Z):- isInt(N) -> Z is N mod 5 ; Z = N.
%add this modified element to the output list.
addtolist(Y,[],[Y]).
addtolist(Y,[H|T],[H|N]):- addtolist(Y,T,N).
memb, mod2, travail addtolist comme prévu, mais je fais quelque chose de mal dans modhelper que je ne suis pas en mesure de comprendre. Toute aide est appréciée.
Merci pour la réponse. Ceci est pour les devoirs. Je ne pense pas que je suis autorisé à utiliser maplist. Je pense que je sais ce que j'ai fait mal. Je dois juste supprimer l'élément que j'ai traité avant d'envoyer la liste pour la récursion dans modhelper. Cependant, je suis confronté à un autre problème. quand l'entrée est comme, ? -mod5 (X, [[[12]], a]). X = ["/ r"]; son interprétation [12] comme "/ r". Comment puis-je empêcher cela? – sher
Mettez à jour votre question en spécifiant quel type d'entrées vous voulez autoriser et quel devrait être le résultat sur les entrées qui contiennent un nombre entier. – Kaarel
? -mod5 (X, [a, 16, b, c (5), [[12]], 8]). X = [a, 1, b, c (5), [[12]], 3]. Cela couvre la plupart des entrées je suppose. Un non entier doit rester intact. Cependant, dans le cas de [[12]], depuis la valeur ASCII de "\ f" (saut de page), il sort ["\ f"] quand je veux qu'il sorte [[12]] tel quel. – sher