2010-11-17 8 views

Répondre

3

Il suffit d'imposer la transitivité et l'antiréflexivité.

fact { 
    no a: Item | a in a.upgrades 
} 

fact{ 
    all a,b,c: Item | 
    a in b.upgrades and b in c.upgrades implies 
    a in c.upgrades 
} 
+0

Puis-je suggérer une syntaxe * pointfree *? Votre premier fait peut être écrit comme «no upgrades & iden», et votre deuxième fait peut être écrit comme «upgrades.upgrades in upgrades». – afsantos

2

votre exemple, je déduis que le upgrades rapport ne vise pas à être transitif: dans l'exemple, une épée de diamant à niveau une épée de pierre, et une épée en pierre à niveau une épée en bois, mais la paire WoodSword - > DiamondSword n'est pas dans la relation upgrades.

Donc ce que vous voulez dire est quelque chose comme

fact upgrades_acyclic { 
    no x : univ | x in x.^upgrades 
} 

Certains modélisateurs préfèrent la formulation plus succincte en termes de relations:

fact upgrades_acyclic { no ^upgrades & iden } 
+0

Merci d'avoir signalé mon erreur. Depuis que presque deux ans se sont écoulés depuis que j'ai posé cette question, je ne me souviens plus de ce que je travaillais réellement, que je ne veuille ou non vraiment pas de transitivité. Donc je ne sais pas si c'est un problème avec ma question ou ma réponse D: – badp