J'ai travaillé sur un petit projet avec prolog. J'ai remarqué que lorsque l'enlèvement construit en prédicats comme append(?List1, ?List2, ?List1AndList2)
et subtract(+Set, +Delete, -Result)
en faveur d'autres alternatives ([Head | List2]
lorsqu'ils traitent avec une liste et un seul élément, écrire mon propre prédicat pour soustraire, etc.)Complexité temporelle des prédicats intégrés
Je me demandais comment optimiser construit en prédicats sont généralement en prolog? Je lis que la complexité des Soustraire est |Delete|*|Set|
, et je suis tout à fait une augmentation significative en utilisant:
removeFriendsOfS(S, [Head | Tail], OutputAcc, Output) :-
relation(S, Head),
removeFriends(S, Tail, OutputAcc, Output),
!.
removeFriendsOfS(S, [Head | Tail], OutputAcc, Output) :-
not(relation(S, Head)),
removeFriends(S, Tail, [Head | OutputAcc], Output),
!.
est-il recommandé d'écrire vos propres prédicats plutôt que d'utiliser ceux qui existent déjà? J'ai récemment commencé avec prolog, donc je ne suis pas encore expérimenté.
Je ne vois pas comment ce prédicat fonctionnerait, puisqu'il n'y a pas de base de '' [] '. –
Certains prédicats intégrés sont écrits en C "sous le capot" et sont de bons interprètes. Cependant, il est possible qu'un prédicat intégré soit plus général que vous ne le souhaitiez, et écrire un prédicat moins général peut donner de meilleurs résultats à la perte de généralité (je regarde les coupes que vous avez et je pense que c'est peut-être le cas) . Etes-vous sûr que vous faites une comparaison à l'identique en termes de fonctionnalité? – lurker
Je semble avoir oublié d'inclure le cas de base 'removeFriends (_, [], Output, Output): -! .' – cjerik