2009-12-10 7 views
1

Je me demandais, comment pourrais-je utiliser le trait de soulignement deux fois mais vérifier que les deux instances de ce trait de soulignement unifier?Wildcards Prolog

Ce que je dois essentiellement est quelque chose qui retourne vrai si deux éléments de la même valeur dans un mapping existe ...

i.e. member((_,_),[(a,a),(b,a),(c,a)]).

Si j'utilise une variable que cela les rend unifiées?

i.e. member((A,A),[(a,a),(b,a),(c,a)]).

Mais il retourne la variable plutôt que vrai.

J'ai besoin d'éclaircissement.

+0

est pas un Underscore générique. Il est utilisé pour indiquer que vous ne vous souciez pas de la valeur que cela prend du tout. Du point de vue de la contrainte-satisfaction, vous ne placez aucune contrainte sur cette variable. Cela signifie que deux caractères de soulignement différents peuvent prendre différentes valeurs. Vous pouvez facilement vérifier ceci: '? - member ((,), [(b, c)]). >> true.' – nedned

Répondre

5

Votre solution avec une variable est correcte. Renvoyer une variable est un moyen de renvoyer la valeur true.

Cela signifie vraiment: cet objectif est vrai lorsque var = valeur, par opposition à cet objectif est vrai.

Notez que l'utilisant comme une clause dans un prédicat différent masquera la variable:

contains_identical_pair(List) :- member((A,A),List). 
2

Vous pouvez utiliser la double négation pour éviter les liaisons variables:

?- \+ \+ member((A,A),[(a,a),(b,a),(c,a)]). 
true. 
+0

c'est assez chic;) – sharky

2

Les liaisons pour les variables imprimées sur l'écran prologue sont juste là pour rendre la vie plus facile dans une invite interactive de sorte que vous n'avez pas à imprimer les variables qui vous intéressent à chaque fois. Ils n'affectent pas du tout la logique de votre code.

Ils ne seront imprimés que pour les variables qui sont saisies à l'invite. Donc, si le prédicat que vous écrivez fait partie d'un programme plus important, vous pouvez simplement ignorer cette sortie, ou si vous voulez que ce soit un prédicat de niveau supérieur que les gens appellent depuis l'invite et que vous ne voulez pas que la sortie soit imprimée, Ensuite, enveloppez simplement votre appel dans un prédicat qui n'a aucun argument ou n'a que des arguments d'entrée. à savoir:

wrapper :- 
    predicate(Out1,Out2). 

ou:

wrapper(In1,In2) :- 
    predicate(In1,In2,Out1,Out2).