2011-03-27 3 views
0

Disons que je veux avoir une règle de comparaison similaire àitérer par alphabet en Prolog

isin(0,_). 
isin(N,List) :- member(N,List), write(N), N1 is N-1, isin(N1,List). 

mais la liste contiendra des symboles de l'alphabet (par exemple [a, b, d, e, h]). Comment puis-je envoyer l'élément suivant à l'itération? (donc N est un symbole, pas un nombre). Et si ce n'est pas possible, comment puis-je faire quelque chose de similaire?

Merci d'avance!

Répondre

3

@julkiewicz est presque là:

isin(a, _). 
isin(Char, List) :- 
    member(Char, List), 
    char_code(Char, Code), 
    write(Char), 
    Code1 is Code-1, 
    char_code(Char1, Code1), 
    isin(Char1, List). 

Notez que le prédicat toujours réussir sur a, tout comme votre version originale réussit toujours 0. Vous pouvez empêcher que, en modifiant la clause de base à quelque chose comme

isin(Char, _) :- 
    char_code(a, A), 
    Char is A-1. 

(Mais ce qui est vraiment une bidouille horrible.)

+0

Merci! ça a fonctionné parfaitement! (mais apparemment, il ne résout pas mon problème xD) – Kirby

+0

@Kirby: Je m'en doutais autant, car je ne comprenais pas votre code en premier lieu ... peut-être pourriez-vous poster une nouvelle question décrivant quel problème vous essayiez de résoudre? –

2

REMARQUE: Cela fonctionne sur les chaînes, pas sur les symboles comme demandé par l'OP.

Eh bien, il semble que les caractères sont interprétés comme des listes de nombres. Donc, cela fonctionne:

?- X = "a". 
X = [97]. 
?- X is "a". 
X = 97. 
?- X is "a" + 1. 
X = 98. 

C'est donc ce que je propose:

isin("a", _). 
isin(N, List) :- member(N, List), N1 is N - 1, isin([N1], List). 

ai pas écrit quoi que ce soit dans cette langue depuis longtemps cependant.

+0

Sauf que 'write' sur la chaîne (liste des codes char)' « a » 'prints' [97]'. –

+0

Oui, c'est vrai. Ce sont des numéros de liste, mais 'is' les décompresse automatiquement. – julkiewicz

+0

problème est, le a est un symbole, pas une chaîne (ils sont dans le sommet du graphique, comme le graphique (a, b).) – Kirby