7
votes

Prologit tous différents

J'ai un problème très étrange avec Prolog. Je l'ai déjà utilisé, mais ça fait un moment et je suis rouillé. J'ai une liste de variables et j'ai besoin de vous assurer qu'aucun d'entre eux n'est identique.

J'ai essayé: p>

Utilisez_module (bibliothèque (limites)). All_Différent (A, B, C, D, 6, 8). CODE> P>

Cependant, lorsque j'essaie ceci, je reçois une erreur disant que All_Différent / 6 est indéfini. P>

Comment puis-je faire de la résolution de ce problème? Y at-il une fonction de bibliothèque que je peux appeler directement pour cela? P>

Je suis très bloqué et j'apprécierais grandement toute aide. P>

Merci d'avance. P>

solve([
    [A, 6, 1],

    [B, 5, C, 2, D, E, F, G, 6],

    [6, H, I, 5, J, K, 2, L, 3],

    [5, M, 6, N, O, 4, P, Q, 5],

    [4, R, S, T, U, 6, V, 4, W],

    [2, 0, X]
  ]) :-
     all_different([A,6,1,2,D,E]),
     all_different([B,5,C,6,H,I]),
     all_different([C,2,D,I,5,J]),
     all_different([D,E,F,J,K,2]),
     all_different([F,G,6,2,L,3]),
     all_different([H,I,5,M,6,N]),
     all_different([5,J,K,N,O,4]),
     all_different([K,2,L,4,P,Q]),
     all_different([5,M,6,4,R,S]),
     all_different([6,N,O,S,T,U]),
     all_different([O,4,P,U,6,V]),
     all_different([P,Q,5,V,4,W]),
     all_different([T,U,6,2,1,X]),

     A<7, A>0,       B<7, B>0,       C<7, C>0,       D<7, D>0,
     E<7, E>0,       F<7, F>0,       G<7, G>0,       H<7, H>0,
     I<7, I>0,       J<7, J>0,       K<7, K>0,       L<7, L>0,
     M<7, M>0,       N<7, N>0,       O<7, O>0,       P<7, P>0,
     Q<7, Q>0,       R<7, R>0,       S<7, S>0,       T<7, T>0,
     U<7, U>0,       V<7, V>0,       W<7, W>0,       X<7, X>0.


1 commentaires

Désolé, le code semble légèrement gâché, mais je n'ai pas pu trouver un moyen de le formater correctement


3 Réponses :


9
votes
all_different([A,B,C,D,6,8]).
I believe that only a List can be passed into all_different.

19 commentaires

J'ai essayé cela et obtenu cette erreur: procédure non définie: all_différent / 1. Des pensées?


Je suppose que vous avez toujours eu ceci:: - Utilisez_module (bibliothèque (limites)).


J'ai toujours utile_module (bibliothèque (limites))


Quelle version de prolog utilisez-vous? Type et numéro.


Hmmmm, je vois maintenant raison pour laquelle cela ne devrait pas fonctionner. Pouvez-vous publier tout l'extrait de code en modifiant votre op?


Essayez: - Utilisez_module (Bibliothèque (CLPFD)).


Pas de chance. Il est toujours dit: Erreur: Solve / 1: Procédure non définie: All_Différent / 1


Voyons si nous pouvons réduire cela. Essayez de couper votre procédure de sorte que la seule fonction All_Différent lit All_Différent ([A, B, C]). Voir si cela fonctionne. Ensuite, essayez all_différent ([1,2,3]). Voir si cela fonctionne. Est-ce que 1 fonctionne et pas l'autre?


J'ai essayé ce que vous avez dit en modifiant l'extrait que j'ai fourni. J'ai d'abord supprimé tous les chiffres afin que mes déclarations all_différentes ne disposaient que de lettres. Cela m'a donné la même erreur. Donc, je me suis débarrassé de cela et j'ai essayé à nouveau avec seulement des chiffres cette fois-ci. Je reçois toujours la même erreur. J'ai essayé d'utiliser uniquement Use_Module (bibliothèque (limites)). et seulement utiliser_module (bibliothèque (CLPFD)). et les deux. Rien ne semble fonctionner jusqu'à présent.


Eh bien, je n'ai pas de prologique sur cet ordinateur, mais je vais l'obtenir et gâcher avec All_Différent de voir ce que je peux découvrir.


Merci soooo beaucoup ... vraiment. Cela m'a conduit à des noix depuis un certain temps maintenant


Avez-vous ce fichier? C: \ Fichiers de programme \ PL \ Bibliothèque \ CLP \ LIMITES.PL Remarque: Votre prologue pourrait être installé ailleurs.


Je fais cela sur le serveur d'école et je suis sûr que cela est maintenu correctement. BTW, ça marche Linux


Je verrais si vous pouvez trouver ce fichier dans la bibliothèque Prolog.


Lorsque j'accède à l'interpréteur de Pralog à partir de /usr/local/packages/pl -5.6.58/lib/pl -5.6.58 En tapant «PL» (sans guillemets) dans la coque UNIX, je reçois une invite de prolog. Ici, si j'essaie d'importer CLPFD, il compile environ 5 choses différentes et des travaux all_Différents. Cependant, je ne suis pas capable d'ajouter ceci à mon chemin ni que je peux apporter mon fichier de code dans ce répertoire (problèmes avec les autorisations). Des pensées?


Honnêtement, je n'ai aucune idée. Je contacterais l'administrateur du réseau scolaire et je ferais appeler son aide.


@Kevin Crowell. Merci de votre aide. J'ai envoyé un courriel à mon sysadmin lui disant exactement ce que je viens de vous dire (pas encore de réponse). Mais c'est un problème d'administration, comme vous l'avez dit. Merci encore


@Kevin Crowell: J'ai une autre question sur le code que j'ai posté - car j'ai un <7, A> 0, etc., vérifie que Prolog Vérifie toutes les valeurs possibles de la hache qui sont différentes et renvoient une configuration de la hache qui sont tous différents et entre 1 et 6?


S'il y a plusieurs solutions, Prology les attrapera.



2
votes

Je suppose que> / 2 et 2 peut ne rien savoir sur les attributs que All_Différent / 1 appliquée aux vars dans la liste. Dans Swi-Prologic, le prédicat est fourni par la bibliothèque (CLPFD) et entre autres prédicats de cette bibliothèque, il y a # 2.

        ?- all_different([X,Y]), 0 #< X, X #< 3, 1 #< Y, Y #< 4, indomain(X), indomain(Y). 
        X = 1,
        Y = 2 ;
        X = 1,
        Y = 3 ;
        X = 2,
        Y = 3.


0 commentaires

1
votes

La bibliothèque de contraintes "IC" de Eclipse Prolog fournit le prédicat AllDifférent / 1, qui prend une liste de variables comme argument, par exemple, AllDifférent ([x, y]) et calcule ce que vous avez cherchent.


0 commentaires