2016-11-27 5 views
0

Si j'ai ceci:Vérification foncteur dans une liste

?:check_dv([v(1,x),v(2,y)], X). 

Comment puis-je vérifier ce qui est le deuxième argument, par exemple v(1,x) (dans ce cas x)?

Une fois que j'ai la tête de la liste: [Head | Tail], avec Head = [v(1,x)], comment puis-je le vérifier?

Répondre

1

Si vous savez que tous les éléments sont de la forme v(_,_), vous pouvez simplement utiliser unification:

Head = v(_, x) 

Cela réussit ssiHead est de cette forme, et fonctionne correctement dans toutes les directions.

Si les éléments de la liste ne sont pas si homogène, vous pouvez utiliser   arg/3:

arg(2, Head, x) 

Notez que cela ne fonctionne que si Head est suffisamment instancié, et est pour cette seule raison déjà moins   préférable:

 
?- arg(2, v(a,x), x). 
true. 

?- arg(2, Head, x). 
ERROR: arg/3: Arguments are not sufficiently instantiated 
+0

Tha nks, j'ai compris! La même idée m'est venue 5 minutes plus tard. : D – Daesos

+0

Je suppose que vous voulez dire 5 minutes après avoir lu ceci ;-) – mat

+0

Non, sérieusement. J'ai simplement besoin d'une pause dans la programmation. : D – Daesos