2014-05-16 5 views
1

Je suis en train de droite un prédicat Prolog qui accepte un élément, une liste, et un certain nombre, et vérifie si l'article est dans la liste que nombre de fois. Par exempleproblèmes avec prédicat Prolog

count(7,[3,7],X). 

retournera X=1.

count(7,[3,7],1). 

reviendriez true

C'est ce que j'ai jusqu'à présent

count_occur(A,[0|B],D). 
count_occur(A,[A|C],D) :- count_occur(A,C,D1), D is D1+1. 
count_occur(A,[B|C],D) :- count_occur(A,C,D). 

Je suis très nouveau pour Prolog et vraiment du mal à comprendre ce paradigme de programmation. Ce que j'essaie de faire est de voir si le premier élément de la liste correspond à la valeur transmise (A), s'il incrémente D et vérifie de nouveau par rapport au reste de la liste. C'est comme ça que je le ferais en Lisp ou dans une autre langue de toute façon. Pourrait vraiment utiliser un peu d'aide, été à ceci pendant un moment et il ne clique pas juste pour moi.

+0

Quel est le but de la première ligne? Et vous devez gérer le cas d'avoir une liste vide. –

Répondre

1

Je n'ai pas Prolog en ce moment pour le tester, mais je voudrais essayer comme ça:

count_occur(A, [], 0). 
count_occur(A, [A|T], D):- count_occur(A, T, D1), D is D1 + 1. 
count_occur(A, [B|T], D):- A \= B, count_occur(A, T, D). 

L'idée est que si la liste est vide, il y a 0 occurrences de chaque élément. Le reste est presque le même que le tien car je pense que c'est correct. La seule différence est que j'ai ajouté A \= B, ce qui devrait signifier A \neq B. Je pense que sinon, il acceptera A == B, ce qui pourrait conduire à count_occur(3, [3], 0). être vrai. Vous devriez vérifier à ce sujet.

J'espère que cela aide!

+0

Hey merci beaucoup qui a fonctionné! La partie A/= B n'était pas nécessaire, ce qui signifie que je devais changer mon premier fait pour le faire fonctionner. Je peux voir maintenant comment passer de D à 0 serait vrai dans le cas de base, mais je suis curieux de savoir comment prologue peut résoudre le cas où la liste n'a qu'un seul élément. Un appel comme count_occur (7, [7], X) n'aurait-il pas de règle qui s'applique à lui parce qu'il n'y aurait pas deux valeurs dans la liste à lier à B et T ou A et T? Ca marche mais je ne comprends pas encore comment ça se fait. – user3538411

+0

Eh bien, pour autant que je me souvienne [7] est équivalent à [7 | []], il va à cette deuxième règle. Comme pour 'A/= B', au moins l'implémentation que j'ai donne ? - count_occur (3, [3], 0). vrai. ce que je ne pense pas est correct. –

Questions connexes