2017-10-06 1 views
1

Alors ce que je cherche est essentiellement ceci:Comment puis-je trouver la liste dans une liste de listes dans laquelle la première occurrence d'un certain atome est trouvée?

findatom(A, L, NL), 
with inputs: 
A = -, %sought after atom 
L = [[1,2,3], [2,-,3], [1,2,3]] %list of lists 
and then it outputs: 
NL = [2,-,3] %the first list containing the sought after atom 

comment serait-ce possible? J'ai essayé ceci:

/*Append something (dummy variable) with the first occurence of the 
sought after atom (L), then output everything after the found atom (L). */ 

     findatom(L, List, NewList) :- 
      append(_, [L|T], List), 
      NewList = [L|T]. 

Cela ne fonctionne que s'il existe une liste d'atomes, pas une liste de listes. Comment pourrais-je développer cela pour le faire fonctionner pour une liste de listes?

+0

Bien que l'append peut être utilisé de la manière la plus surprenante, il n'est pas tout à fait clair pour moi pourquoi vous pensez l'utiliser? –

Répondre

1

Faisons-le un en mots: findatom(A, L, NL) trouve la liste NL dans L tel que A est dedans. Remplaçons ces mots avec des prédicats Prolog: findatom(A, L, NL) trouve le member NL de L tel que A est un membre de NL.

findatom(A, L, NL) :- 
    member(NL, L),  % find an item NL in L 
    memberchk(A, NL). % that contains A 

Le pro de l'utilisation memberchk ici est qu'il est déterministe, de sorte que vous n'avez pas à vous soucier de multiples solutions parasites.