Comme indiqué par d'autres, votre exemple original
test(A, B, C, D) :- cond(A), cond(B); cond(C), cond(D).
est parfaitement valide (en supposant l'analyse syntaxique est comme vous le souhaitez il). Tu n'as pas essayé?
Notions élémentaires
logique ET
foo :- a , b .
logique OU
foo :- a ; b .
Combiné
foo :- a , b ; c , d .
Les Parsis ci-dessus comme:
foo :- (a , b) ; (c , d) .
Utilisez les parenthèses pour indiquer une autre liaison souhaitée:
foo :- a , (b ; c) , d .
Mieux encore, évitons l'opérateur ;
OU et casser des alternatives en types de clauses distinctes. La séquence est beaucoup plus facile à comprendre pour les gens que la ramification des structures arborescentes. Briser l'alternance en plusieurs clauses simplifie le test/débogage et améliore la compréhension.Par conséquent, préfèrent
foo :- a , b .
foo :- c , d .
sur
foo :- a , b ; c , d .
et préfèrent
foo :- a , bar , d .
bar :- b .
bar :- c .
sur
foo :- a , (b ; c) , d .
Peut-être le plus important, briser les choses en plusieurs clauses comme celui-ci rend la maintenance plus tard easi er. Avec une structure comme:
foo :- a , b ; c , d .
Que faites-vous lorsque vous ajoutez un autre cas? Qu'en est-il quand il s'étend à 50 alternatives? Chaque alternative supplémentaire augmente le nombre de chemins de code à travers la clause, rendant ainsi le test et la compréhension plus difficiles. Pour obtenir une couverture de code complète lors des tests, un grand nombre de chemins alternatifs doivent être testés individuellement.
Avec la structure équivalente
foo :- a , b .
foo :- c , d .
Ajout d'alternatives est tout simplement une question d'ajouter ou plusieurs clauses supplémentaires, dont chacun peut être testé de manière isolée. Un programmeur professionnel écrit d'abord pour les personnes qui, plusieurs années plus tard, ont besoin de comprendre, de modifier et de corriger ce code (indice: cette personne pourrait être vous-même).
Si vous aviez essayé d'exécuter ce morceau de code, vous auriez trouvé qu'il fait exactement ce que vous voulez. –