2012-10-15 6 views
0

Je viens de commencer à travailler avec Prolog et je ne comprends pas comment travailler avec plusieurs prédicats. Par exemple je dois résoudre le problème suivant: Substituer dans une liste une valeur avec tous les éléments d'une autre liste. Ce est le code que je réussi à écrire à ce jour:Prolog, travailler avec plusieurs prédicats

domains 
    elem=integer 
    list=elem* 

predicates 
    %append to a list already created another list. There are 3 list parameters 
    %because I don't know other method 
    append (list,list,list) 
    %This will search the list (the first one) for the searched element and 
    %it is it will replace it with the list(the second one). The result will be 
    %kept in the third list. 
    add(list,list,elem,list) 

goal 
    add([1,2,3,2,1],[4,5],2,L), 
    write (L). 
clauses 
    add ([],[_],_,[]). 
    add ([A|L],L1,E,[A|L2]):- 
     add(L,L1,E,L2). 
    add ([E|L],L1,E,L2):- 
     add(L,L1,E,L2). 
    append([],[],L2). 
    append([],[X|L1],[X|L2]):- 
     append([],L1,L2). 

Répondre

1

Est-ce que votre définition append fonctionne? Je pense que devrait être

append([], L, L). 
append([X|Xs], Ys, [X|Zs]):- 
     append(Xs, Ys, Zs). 

Le append prédicat il est l'un des outils les plus élémentaires en matière de programmation Prolog, mieux garder le comportement habituel, ou de changer le nom ...

Au lieu de add, un meilleur nom pourrait être replace_elem_with_list. Pour l'implémenter, vous devez effectuer une itération, inspecter chaque élément et, lorsque vous trouvez une correspondance avec ce qui est requis pour remplacer, ajoutez la liste au lieu de copier l'élément.

Quelque chose comme

% replace_elem_with_list(ToSearch, Replacement, SoughtElem, Result) 
replace_elem_with_list([E|Es], Replacement, E, Result) :- 
    !, replace_elem_with_list(Es, Replacement, E, Rs), 
    append(Replacement, Rs, Result). 

Je vous laisse les 2 autres cas dont vous aurez besoin pour couvrir (lorsque l'élément ne correspond pas et la base de récursivité, qui sont similaires à append)

la résultat:

?- replace_elem_with_list([1,2,3,4,2,3,4],[a,b],2,L). 
L = [1, a, b, 3, 4, a, b, 3, 4]. 
Questions connexes