Prologue de compter le nombre de fois qu'un prédicat est vrai
Je veux compter le nombre de fois qu'un personnalisé prédicat est vrai.
Par exemple, j'ai le code suivant:
is_man(john).
is_man(alex).
?:-is_man(X).
X sera de retour de john, puis, si je presse le point-virgule, il sera également de retour d'alex, puis faux.
Je veux construire quelque chose comme:
count(is_man(X), Count).
Et ceci pour revenir
Count = 2
Comment puis-je le faire?
Vous devez vous connecter pour publier un commentaire.
En SWI-Prolog:
aggregate_all/3
ci-dessus utilisefindall/3
et compte des solutions trouvées par les retours en arrière, y compris des solutions identiques. Cependantaggregate_all/4
etaggregate/4
permettre de comptage d'une manière qui ne respecte pas les doublons. Ce pourrait être intéressant d'une Question distincte par vous.Pour une norme ISO Prolog solution, vous pouvez utiliser findall/3 de produire une liste de toutes les solutions, puis le nombre de la longueur de la liste. Il pourrait être un peu difficile de conclure dans un définis par l'utilisateur prédicat comte/2 comme vous le proposer, car nous avons besoin de former le premier argument de findall/3 d'une manière qui tient compte de tout libre (non liée) variables dans le but que vous souhaitez passer comme le premier argument de comte/2.
De nombreux Prologs fournir pour les "compteurs" ou d'autres formes de mutables des valeurs globales, une extension non standard, qui pourrait être utilisé en relation avec une insuffisance conduit "boucle" pour faire le même chef d'accusation. Un peu plus encombrant mais s'en tenir à la lettre du Prologue de la norme serait d'utiliser affirmer et rétracter pour créer votre propre "contre" par le réglage dynamique de fait.
Une illustration de cette dernière approche, qui suit. Ce qui les rend "multi thread safe" nécessiterait davantage de la logique.
count(count((true;true),_),C).
devrait donner 1, mais vous obtenez 3. Aussi, l'ISO n'ontassert/1
maisasserta/1
etassertz/1
.length()
oufindall()