2017-07-15 2 views
1

J'essaye de développer une procédure de prologue qui convertira des nombres dans n'importe quelle liste donnée à une liste de leurs racines carrées, en utilisant l'univ (=..). Jusqu'ici j'aiUtilisation d'un opérateur univ dans Prolog

convert(X,Y): number(X), Y is X^2. 
use([],_,[]). 
use([_|X],convert,L):- 
      convert(X,Y), 
      L =..[convert,X,Y]. 

Ceci évalue faux, ce qui pourrait être mauvais dans ma logique ou exécution?

+0

Typo : 'convertir (X, Y): nombre (X) ...' -> 'convertir (X, Y): - nombre (X) ...'. Voulez-vous dire racines carrées ou carrés? Votre code fait des carrés. Pourquoi utilisez-vous '= ../2'? Son but est de fournir une équivalence entre un terme et une liste. On ne sait pas comment vous pensez que cela résoudrait votre problème. – lurker

Répondre

2

Il y a plusieurs erreurs:

  • pourquoi passer le nom du prédicat converti/2?
  • Le plus important je ne vois pas d'appel récursif !!
  • Vous ignorez l'élément de tête de la liste en écrivant [_ | X] ce qui signifie une liste avec un élément de tête et une queue X.
  • Vous essayez d'utiliser la conversion sur X qui est une liste et assignez l'atome convertir (X, Y) en L. Notez que prolog n'est pas un langage procédural, convertir (X, Y) ne fonctionnera qu'en appelant simplement convertir (X, Y) et le résultat sera en Y, vous ne pouvez pas faire d'assignations comme: L = convert(X,Y) cela n'attribue la atom convert(X,Y) à L.

Vous n'avez pas besoin l'opérateur =.., comme une solution simple serait:

convert(X,Y):- number(X), Y is X^2. 
use([],[]). 
use([H|T],[Y|T1]):- 
      convert(H,Y), 
      use(T,T1). 
+0

Votre code manque un «-'» après le ':' dans la première ligne. Et le premier but d'utilisation/2 devrait être 'convertir (H, Y)' ;-) – tas

+0

@tas, merci !!! ce sont les problèmes lors de l'utilisation de pâte à copier :) !! – coder

+0

Merci, je vais utiliser l'utilisation, je n'avais aucune idée de ce prédicat. – user8291645

4

Vous pouvez également utiliser maplist/3 pour définir use/2 avec convert/2 tel que défini dans votre message:

use(X,Y) :- maplist(convert, X, Y). 

    ?- use([1,2,3],L). 
L = [1,4,9] 

Notez que use/2 est tout simplement défaut pour les listes qui contiennent tout sauf les numéros:

?- use([1,2,3,a],L). 
no 
+2

Que 'convert/2' ... réussisse pour' convert (X, 2) 'avec' X = 2', mais échoue pour 'X = 2, convert (X, 2)'. – false

+0

@false: Merci de l'avoir signalé. Ce détail a totalement échappé à mon attention. J'ai enlevé le code défectueux. – tas

+0

... mais vous devez le remplacer par un code correct ... – false