2010-12-16 378 views
2

J'ai ceci:GNU Prolog - table de multiplication

:- dynamic(times/3). 
mult :- mult([0,1,2,3,4,5,6,7,8,9]). 
mult(Num) :- 
    append(L1,[X|R1],Num), 
     append(L2,[Y|R2],Num), 
      Prod is X*Y, 
      assertz(times(X,Y,Prod)),fail. 

est-il une meilleure façon de le faire. Créer une table de multiplication par exemple avec les temps (X, Y, XY) faits.

Alors que cela fonctionne, je me demandais s'il y avait un moyen de le faire sans l'échec, parce que quand je n'ai pas l'échec, il vient juste avec vrai? pour plus de réponses. Je veux juste qu'il passe toutes les réponses sans demander.

Répondre

3

Ajouter une dernière clause "tomber à travers" à mult/1 qui réussit toujours, par ex. mult (_).

Votre appel à mult/1 va alors réussir à construire la table de multiplication et à réussir, ce qui vous permettra de poser d'autres sous-objectifs après lui.

Il me semble plus naturel de coder le mult/1 prédicat en utilisant membre/2 plutôt que append/3, mais avec une telle liste courte, il est probablement pas un grand gaspilleur de temps.