8
votes

Forcer Prolog de choisir des valeurs uniques des variables


5 commentaires

DIF (v1, v2) etc. mappiste (DIF (v1), [v2, v3, v3])


Mais n'est pas div (v1, v2) équivalent à V1 \ = V2, donc je dois toujours le faire 120 fois pour que les 6 variables ne soient pas les mêmes ?!


Notez que c'est DIF / 2. Oui, c'est la même chose. Avec la carte, vous êtes déjà raccourcie. Pour raccourcir encore plus loin un prédicat auxiliaire AllDIF / 1, qui est vrai si tous les éléments de la liste sont différents.


Ok, et comment puis-je faire ça? N'oubliez pas que je suis toujours un débutant qui commence à commencer cela, alors ne supposez donc pas que je suis capable de remplir le etc. ou insérer plus ici .


Si vous êtes si tôt dans le jeu, n'essayez pas de sauter de l'avant; Travaillez les choses étape par étape. Au début, vous devrez taper plus de solutions verbeuses, peu importe. Ensuite, lorsque vous arrivez aux trucs les plus avancés, vous l'apprécierez encore mieux.


3 Réponses :


0
votes

longueur (liste, n) : n est la longueur de la liste
Trier (Liste, TritedList) : TritedList est une version triée de la liste (les éléments en double sont supprimés)

D'autre part, il peut être plus rapide d'avoir une liste de mots disponibles et d'enlever un quand il est utilisé; Non seulement vous n'aurez pas à faire le chèque à la fin, mais vous éviterez les instanciations inutiles ( A1 = foo, a2 = foo arrêtera immédiatement au lieu de se faire rejeter à la fin). En d'autres termes, la taille de la succursale.


1 commentaires

Merci, mais pouvez-vous élaborer un peu plus comment puis-je utiliser les faits fournis par l'exercice pour atteindre enfin Crossword (V1, V2, V3, H1, H2, H3) Qui garantissent que chacun est différent? C'est le point de cet exercice.



0
votes

Soit ce que @false vous a dit dans les commentaires; Ou j'aime utiliser Sélection de domaine :

selectM([A|As],S,Z):- select(A,S,S1),selectM(As,S1,Z).
selectM([],Z,Z).

word(astante,  [a,s,t,a,n,t,e]). 
word(astoria,  [a,s,t,o,r,i,a]). 
word(baratto,  [b,a,r,a,t,t,o]). 
word(cobalto,  [c,o,b,a,l,t,o]). 
word(pistola,  [p,i,s,t,o,l,a]). 
word(statale,  [s,t,a,t,a,l,e]).

crossword(Words) :- findall(W, word(_,W), WS),
   Words = [[ _,A,_,B,_,C,_], 
            [ _,D,_,E,_,F,_], 
            [ _,G,_,H,_,I,_],
            [ _,A,_,D,_,G,_],
            [ _,B,_,E,_,H,_],
            [ _,C,_,F,_,I,_]],
   selectM( Words, WS, _).


6 commentaires

Merci, votre approche semble élégante. Mais vous avez modifié la liste des faits donnée dans l'exercice?


@jbx oui je l'ai fait. :) Si vous n'êtes pas autorisé, vous pouvez en convertir un en un autre: Wordl (W): - Word (_, A, B, C, D, E, F, G), W = [< / code> insérer plus ici ]. . Ensuite, vous pouvez utiliser wordl au lieu de mot dans l'appel à retranchez .


Eh bien, ce n'est pas je ne suis pas autorisé, c'est comme ça que l'exercice est et j'essaie d'apprendre lentement les choses. Qu'est-ce que le insérer plus ici a?


@jbx je l'ai laissé pour que vous puissiez comprendre. :) Dis, pour mot (jour, d, a, y) nous voudrions w = [d, a, y] , non? Si cela est difficile pour vous en ce moment, il est probablement préférable d'étudier d'abord une introduction à Prolog.


Oui, c'est tout le point. Cet exercice est le chapitre 2 de LearningProlognow.org (chapitre 1 explique simplement des atomes, des termes simples, etc.). J'ai clairement dit que dans la question de savoir que je suis débutant, il est donc difficile pour moi de combler le vide pour le moment. Mais merci pour la réponse aussi.


@jbx essayons à nouveau. Nous convertissons mot (jour, d, a, y) vers [d, a, y] avec mot (_, a, b, c), w = [A, b, c] . Ou si nous avions un fait mot (mois, m, o, n, t, h) nous le convertirions avec mot (_, a, b, c, d, e) , W = [a, b, c, d, e] . Ici, nous avons 7 mots de lettres, c'est tout. est-ce que cela aide?



10
votes

Utiliser alldif / 1 défini comme: xxx

qui peut être utilisé même pour la requête la plus générale: xxx

La signification de l'objectif Maplist (DIF (E), ES) est mieux comprise en examinant les réponses: xxx

C'est-à-dire que ES est une liste d'éléments qui sont tous différents à e . Le but Maplist (DIF (E), [ A, B, C]) combine le premier élément (dans ce cas DIF (E) ) avec chaque élément de la liste. Ainsi, DIF (E, A), DIF (E, B), DIF (E, C) .


9 commentaires

À votre santé! Je viens d'ajouter le alldif que vous avez indiqué et à la fin de mon Mots croisés () Clause J'ai ajouté alldif ([V1, V2, V3, H1, H2, H3 ]) . Merci de votre aide. Il devait y avoir un moyen simple.


@JBX: Vous pouvez l'ajouter aussi au début! De cette manière, l'espace de recherche sera réduit


Bonne idée, merci. C'est déjà assez bon que j'ai réussi à faire fonctionner l'exercice :)


Petite dernière question, qui pourrait être utile pour les lecteurs potentiels. Qu'est-ce que mappiste (dif (e), es) fait réellement? Qu'est-ce que DIF / 1 Comparaison E avec? Et qu'est-ce que maplist / 2 fournir réellement?


@JBX: Demandez à prolog: les réponses à ? - Maplist (DIF (E), ES). sont parfaitement clairs!


@JBX: J'espère que cela ne vous confondre pas. Mais les réponses Pratuology produit sont souvent la manière la plus perspicace de comprendre une relation.


Oui, honnêtement aucune idée :). J'ai essayé mappiste (dif (e), es) . et vient de recevoir es = [] . Quoi que cela signifie :)


Merci, donc juste pour avoir une compréhension claire, comment est un prédicat d'ARITY 2 DIF / 2 utilisé avec la forme d'ARITY 1 dans la "Code> Maplist ?


@jbx: via appel (DIF (x), a) . Quel est le même que DIF (X, A) Voir le lien sur la marise pour plus.