2009-12-03 3 views
2

J'essaie de faire des prédicats tels que pour les listes X et Y, rmlast est vrai si X et Y sont la même liste sauf que Y a 1 élément de plus. Donc [1] [1,2] ou [3,2] [3,2,5].Prolog Beginner

rmlast([], [_]). :- true. 
rmlast([X|xtail], [Y|ytail]) :- rmlast(xtail,ytail), X is Y. 

Ce produit cependant un faux résultat pour autre chose que le cas de base.

+0

La prochaine fois s'il vous plaît marquer les questions de devoirs comme tels: http://www.cs.toronto.edu/~yilan/324f09/324f09a5.pdf – Stephan202

Répondre

6

Votre code ne fonctionne pas car xtail et ytail s'écrivent en minuscule et ne sont donc pas des variables. Cela fonctionne:

rmlast([], [_]). 
rmlast([X|T1], [X|T2]) :- rmlast(T1, T2). 

Autre que:

  1. Comme vous le voyez, il n'y a pas besoin d'avoir des variables X et Y dans ce cas: il suffit d'utiliser X deux fois, dans les endroits appropriés .

  2. Vous écrivez:

    rmlast([], [_]). :- true. 
    

    C'est le même que:

    rmlast([], [_]). 
    :- true. 
    

    Comme vous pouvez le constater, cette deuxième déclaration ajoute rien et peut donc être retiré en toute sécurité.

+1

Je n'ai jamais vu la sensibilité à la casse dans l'instanciation variable avant. C'est sûr que ça a arrangé ça, merci. – meunierd

1
rmlast([H],[]). 
rmlast([H1|Tail1],[H2|Tail2]):- 
      H1 = H2,rmlast(Tail1,Tail2). 

Ne pas utiliser 'est', il est pas un opérateur logique. C'est un opérateur d'affectation. Utilisez '=' à la place.