2011-09-05 4 views
1

Le prédicat ci-dessous ajoute l'élément X à la liste S. Cela fonctionne très bien.Prolog: ajouter la liste pour définir

addToSet(X, S, S) :- 
    atomic(X), 
    member(X, S), 
    !. 
addToSet(X, S, [X|S]) :- 
    atomic(X). 

Je suis en train de l'étendre à un prédicat qui ajoute la liste [H | T] pour régler S. Il fonctionne parfaitement si [H | T] est seulement 2 articles à long ... à savoir si T est également atomique.

addToSet([], S, S). 
addToSet([H,T], S, S2) :- 
    addToSet(H, S, S1), 
    addToSet(T, S1, S2). 

Par exemple, addToSet ([5,6], [1,2,3,4], X). fonctionne comme je le désire. Cependant, addToSet ([5,6,7], [1,2,3,4], X). Ça ne foncrionne pas du tout. Je suis perplexe ... il y a évidemment quelque chose qui ne va pas avec les 2-3 dernières lignes de mon code, mais je ne peux pas le comprendre. Des conseils?

Merci!

+1

envisager de vérifier les prédicats liés à l'ensemble (s'il existe dans votre système prolog) pour swi-prolog, voici quelques http://www.swi-prolog.org/pldoc/doc_for?object=section%282,% 27A.12% 27, swi% 28% 27/doc/Manual/lists.html% 27% 29% 29 –

Répondre

3

addToSet([H,T], S, S2) doit être addToSet([H|T], S, S2). Comme il est, vous correspondez à une liste contenant exactement H et T, pas une liste avec la tête H et la queue T. On dirait juste une faute de frappe.

+0

Wow ... tellement embarrassant. Je jure que j'ai regardé cette chose pendant plus d'une heure en pensant que ça devait être une simple faute de frappe. Je ne peux pas croire que j'ai raté ça. Merci beaucoup! – The111

+0

Ca arrive au meilleur de nous. :) – Ben