7
votes

Elément Prolog in Listes Remplacement

Bonjour, je me demandais si vous pouviez m'aider avec cette

de la programmation de Prolog: écrivez un script PROG pour le remplacement de tout élément donné dans les listes par un autre élément donné. Par exemple: xxx

Merci beaucoup d'avance


1 commentaires

Je n'ai pas encore essayé encore, je ne suis pas sûr de savoir comment y aller.


5 Réponses :


14
votes

Dans Prolog, la plupart des traitements de la liste sont effectués en traitant la tête, puis le traitement de la liste de la liste. Bien sûr, vous ne pouvez pas oublier le boîtier de base, qui est une liste vide.

Remplacement de quelque chose avec quoi que ce soit dans une liste vide Résultats à nouveau dans une liste vide. Si la tête de la liste est la même que l'élément à remplacer, remplacez-le, sinon, gardez-le tel qu'il est. Dans les deux cas, traitez récursivement le reste de la liste. Traduit de l'anglais en prolog: xxx


0 commentaires

0
votes
replace(_, _ , [], []).

replace(X, Y, [ X | Z ], [ Y | ZZ]):- ! , replace( X, Y, Z, ZZ).

replace(X, Y, [ W | Z], [ W | ZZ] :- replace(X, Y, Z, ZZ). 
Though, one would usually arrange the 3. arg to be the first one. And strictly speaking above does not replace anything in the list, it just anwsers if 4th arg is like the one in the 3rd but with Y' instead of X'.

0 commentaires

0
votes
replace(E,S,[],[]).
replace(E,S,[E|T1],[S|T2]):-replace(E,S,T1,T2).
replace(E,S,[H|T1],[H|T2]):-E\=H, replace(E,S,T1,T2).
the idea is simple, if the elements match, change it, if not, go forward until empty.

0 commentaires

0
votes
domains
I=integer*
K=integer*
Z=integer
A=integer
predicates
nondeterm  rep(I,Z,A,K)
clauses
rep([],_,_,[]).
rep([Z|T1],Z,A,[A|T2]):- rep(T1,Z,A,T2).
rep([H|T1],Z,A,[H|T2]) :- rep(T1,Z,A,T2).
goal
rep([1,2,3],2,4,X).

0 commentaires

7
votes

tous les implémentations présentés jusqu'à présent dans d'autres réponses sont logiquement non fidèles lorsqu'ils sont utilisés avec des termes non fondés. Considérez la requête d'origine et une légère variante: xxx

Ça fonctionne! Demandons quelques requêtes très similaires: xxx


Qu'est-ce qui se passe? Mettez le blâme sur sur sur intégré méta-logique (!) / 0 et (\ = =) / 2 , qui sont très difficiles à utiliser le droit et Souvent rendez le code fragile, impur et logiquement malsain.

pour préserver la solidité logique , Stick sur la pureté logique et l'abstention de "fonctionnalités" méta-logiques " dès que possible! Heureusement, la plupart des implémentations de Prolog support prennent en charge DIF / 2 comme alternative logique à (\ =) / 2 . Utilisons-le: xxx

exécutons à nouveau au-dessus des requêtes, cette fois avec l'amélioration de remplac / 4 : xxx < / pré>


0 commentaires