2009-11-12 5 views
2

En Prolog vous pouvez écrire un fait de sol:Utilisations de faits non-terrain dans Prolog?

lost(jen). 

Vous pouvez également écrire un fait non-sol:

lost(X). 

Est-ce que cela fait sens? Pourriez-vous me montrer un exemple pratique/réel où des faits non fondés sont utilisés?

Merci,

Répondre

3

Un autre cas, ce qui évite les listes, est où la plupart des cas sont « vrai » et que vous voulez exclure quelques cas qui sont fausses. Donc, vous échouez délibérément dans ces cas, puis laissez passer tout le reste.

Ensuite, vous pouvez le faire, par exemple ...

inhabited(antarctica) :- !, fail. 

% all the other continents are inhabited 
inhabited(_). 
2

Eh bien, vous pouvez avoir d'autres choses dans les faits en plus des atomes, par exemple, vous pouvez avoir des listes. Une fois que vous avez fait cela, vous voudrez peut-être savoir sur une liste d'un élément, et vous pouvez avoir

oneelement([X]). 

De même, que vous voulez comparer ce qui est le dernier élément dans une liste

lastelement([X],X). 
lastelement([_|Remainder],X) :- lastelement(Remainder,X). 
Le

très utile member prédicat est défini comme

member([X|_],X). 
member([_|Remainder],X) :- member(Remainder,X). 

Chacun de ces utilise un fait non au sol comme cas de base, en faisant correspondre une forme spéciale qui est plus spécifique que juste lost(X)

+0

Je veux juste faire une remarque, que si vous utilisez une variable dans une clause seulement 1 fois (pas 2 ou plusieurs usages), Prolog (en particulier SWI) vous donnera varning, comme "Attention: /path/to/file.pro:123: Singleton variables: [Var]" Vous devriez utiliser _ dans de tels endroits. – Xonix

+0

@Xonix: Ou simplement préfixer le nom existant avec un trait de soulignement comme ceci: '_Foobar'. Cela évite l'avertissement singleton tout en vous permettant d'utiliser un nom explicatif. – bcat

+0

@Xonix: Dans (Sicstus) Prolog, vous devez également vous assurer que la lettre qui suit _ est en majuscule (comme un nom de variable) pour éviter l'avertissement. – Rune