Ok, voici l'affaire:Prolog - valeur de retour de cas de base
- J'ai deux piles de chemises
- Je veux prendre une chemise au hasard de chaque pile et les mettre dans une nouvelle pile
- obtenez alors la nouvelle pile sur
Et voici le code:
mix([],[],_).
mix(P1,P2, Pile):-
takeshirt(P1,1,Taken1,Rem1), takeshirt(P2,1,Taken2,Rem2), #Take one
append(Pile,Taken1,New), append(New,Taken2,NewPile), #Put both of them
mix(Remain1,Remain2,NewPile).
C'est ce que le résultat ressemble à:
1 ?- mix([a,b],[c,d],NewPile).
NewPile = [] .
Je veux que ça ressemble à:
1 ?- mix([a,b],[c,d],NewPile).
NewPile = [b, d, a, c] .
Ou quel que soit le résultat. J'ai vérifié par le débogueur graphique et découvert que lorsque le dernier mélange se produit, les liaisons sont:
P1 = Taken1 = [b]
P2 = Taken2 = [c]
Pile = [a, d]
Rem1 = Rem2 = []
New = [a, d, b]
NewPile = [a, d, b, c] #<--- Interresting
Ainsi, la valeur recherchée est NewPile lorsque le dernier:
mix([],[],_).
arrive. Après cela, il s'effondre comme un château de cartes.
La question est:
mix([],[],_).
Je voudrais revenir à la _ valeur du cas de base, cette règle mélange est effectivement utilisé à partir d'une instance supérieure où je vous envoie en deux piles et récupérez la nouvelle pile.
Mise à jour:
Pour clarifier certains commentaires au sujet de la takeshirt règle, la voici:
takeshirt(_,0,[],_).
takeshirt(List,Number,[Element|Taken],Remain) :- N > 0,
length(List,Len),
Index is random(Len) + 1,
removeshirt_at(Element,List,Index,Remain),
Number1 is Number - 1,
takeshirt(Remain,Number1,Taken,Remain).
La coupure n'est pas nécessaire car 'select' échouera sur une liste vide. –
@larsmans: La coupure peut ne pas être strictement nécessaire ici si l'implémentation de 'takeshirt/4' échoue sur une liste d'entrée vide. Dans mon exemple, cela pourrait être le cas si 'select/3' le faisait, comme vous le dites, mais c'était juste _my_ version pour tester; Je n'ai pas supposé quoi que ce soit à propos de l'implémentation de 'takeshirt/4' que @shaungus a mais n'a pas révélé, sauf pour l'interface. – sharky
Je suppose qu'un prédicat qui prend * n * choses d'une pile échouerait s'il n'y a pas * n * choses sur la pile; ce serait la façon Prolog. Mais assez juste, +1 pour montrer à l'OP comment utiliser 'select'. –