Ok je suis nouveau à Prolog, alors excusez-moi si cela est quelque chose de trivial, mais je ne peux pas sembler trouver une réponse élégante adéquate à cela. J'essaie de travailler sur l'exercice ici sur LearnProlognow.org a >, exercice 2.4 (Mots croisés). L'exercice fournit ces faits: p> et la solution que j'ai proposée pour résoudre le placement croisé de chaque mot est-ce : p> avec La solution semble fonctionner, mais le résultat produit des valeurs dupliquées, le premier résultat étant: p> Comment puis-je forcer PRAGolog d'avoir J'ai trouvé Cette question similaire , mais les réponses fournies Semble tellement compliqué, j'espère qu'il y a une manière plus simple. J'utilise Swi-Prolog sur Ubuntu, juste au cas où cela importait. P> Merci. P> P> v1a code> à
v1g code> etc. étant les caractères de chaque mot, et le
v1bh1b < / code> à
v3fh3f code> étant les caractères communs entre les mots dans le bouton croisé. p>
v1 \ = v2 \ = v3 \ = h1 \ = h2 \ = h3 code>?
Si je les fais individuellement un par un, j'aurai besoin de 120 permutations, il doit donc y avoir un moyen plus rapide, et c'est un exercice débutant pour que je puisse manquer quelque chose. P>
3 Réponses :
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 ( longueur (liste, n) code>: n est la longueur de la liste
Trier (Liste, TritedList) CODE>: TritedList est une version triée de la liste (les éléments en double sont supprimés) p>
A1 = foo, a2 = foo code> arrêtera immédiatement au lieu de se faire rejeter à la fin). En d'autres termes, la taille de la succursale. p>
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) Code> Qui garantissent que chacun est différent? C'est le point de cet exercice.
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, _).
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 i>
]. code>. Ensuite, vous pouvez utiliser
wordl code> au lieu de
mot code> dans l'appel à
retranchez code>.
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 code> a?
@jbx je l'ai laissé pour que vous puissiez comprendre. :) Dis, pour mot (jour, d, a, y) code> nous voudrions
w = [d, a, y] code>, 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) code> vers
[d, a, y] code> avec
mot (_, a, b, c), w = [A, b, c] code>. Ou si nous avions un fait
mot (mois, m, o, n, t, h) code> nous le convertirions avec
mot (_, a, b, c, d, e) , W = [a, b, c, d, e] code>. Ici, nous avons 7 mots de lettres, c'est tout. est-ce que cela aide?
Utiliser qui peut être utilisé même pour la requête la plus générale: p> La signification de l'objectif C'est-à-dire que alldif / 1 code> défini comme:
Maplist (DIF (E), ES) code> est mieux comprise en examinant les réponses: p>
ES code> est une liste d'éléments qui sont tous différents à
e code>. Le but Maplist (DIF (E), [ A, B, C]) combine le premier élément (dans ce cas
DIF (E) code>) avec chaque élément de la liste. Ainsi,
DIF (E, A), DIF (E, B), DIF (E, C) CODE>. P> P>
À votre santé! Je viens d'ajouter le alldif code> que vous avez indiqué et à la fin de mon
Mots croisés () code> Clause J'ai ajouté
alldif ([V1, V2, V3, H1, H2, H3 ]) code>. 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) code> fait réellement? Qu'est-ce que
DIF / 1 code> Comparaison
E code> avec? Et qu'est-ce que
maplist / 2 code> fournir réellement?
@JBX: Demandez à prolog: les réponses à ? - Maplist (DIF (E), ES). Code> 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) code>. et vient de recevoir
es = [] code>. Quoi que cela signifie :)
Merci, donc juste pour avoir une compréhension claire, comment est un prédicat d'ARITY 2 DIF / 2 CODE> utilisé avec la forme d'ARITY 1 dans la "Code> Maplist code>?
@jbx: via appel (DIF (x), a) code>. Quel est le même que
DIF (X, A) CODE> Voir le lien sur la marise pour plus.
DIF (v1, v2) code> etc.
mappiste (DIF (v1), [v2, v3, v3]) code>
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. code> ou
insérer plus ici code>.
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.