2009-11-16 15 views
24

Interview Frage!Prolog - Mitglied Prädikat One-Liner

Dies ist, wie Sie in der Regel die member Beziehung in Prolog definieren:

member(X, [X|_]).  % member(X, [Head|Tail]) is true if X = Head 
         % that is, if X is the head of the list 
member(X, [_|Tail]) :- % or if X is a member of Tail, 
    member(X, Tail).  % ie. if member(X, Tail) is true. 

definieren es nur eine Regel.

+14

Interview für einen Job? welcher Beruf? woher? bekommen Menschen dank Prolog Arbeit? –

+4

jane st capital – Claudiu

Antwort

33
  1. Lösung:

    member(X, [Y|T]) :- X = Y; member(X, T). 
    
  2. Demonstration:

    ?- member(a, []). 
    fail. 
    ?- member(a, [a]). 
    true ; 
    fail. 
    ?- member(a, [b]). 
    fail. 
    ?- member(a, [1, 2, 3, a, 5, 6, a]). 
    true ; 
    true ; 
    fail. 
    
  3. Wie es funktioniert:

    • Wir sind für ein Auftreten des ersten Arguments suchen, X, in den s zweites Argument, [Y|T].
    • Das zweite Argument wird als Liste angenommen. Y entspricht seinem Kopf, T entspricht dem Schwanz.
    • Als Ergebnis schlägt das Prädikat für die leere Liste fehl (wie es sollte).
    • Wenn X = Y (d. H. X kann mit Y vereinheitlicht werden) dann fanden wir X in der Liste. Ansonsten (;) testen wir, ob X im Heck liegt.
  4. Bemerkungen:

    • Dank humble coffee für den Hinweis auf, dass = (Vereinigung) mit flexiblerem Code als mit == (Prüfung auf Gleichheit) ergibt.
    • Dieser Code kann auch die Elemente einer gegebenen Liste aufzuzählen verwendet werden:

      ?- member(X, [a, b]). 
      X = a ; 
      X = b ; 
      fail. 
      
    • Und es verwendet werden kann, um „aufzählen“ alle Listen, die ein bestimmtes Element enthalten:

      ?- member(a, X). 
      X = [a|_G246] ; 
      X = [_G245, a|_G249] ; 
      X = [_G245, _G248, a|_G252] ; 
      ... 
      
    • Ersetzen = durch == in den obigen Code macht es viel weniger flexibel: es würde sofort auf member(X, [a]) Fehler und verursachen einen Stack-Überlauf auf member(a, X) (getestet mit SWI-Prolog Version 5.6.57) .

+0

hmm sehr süß. Der Schlüssel war der; Operator - ich wusste nicht, dass du es tun könntest oder innerhalb einer Regel bist. – Claudiu

+2

Wenn Sie "X == Y" durch "X = Y" ersetzen, können Sie member (X, [a]) verwenden. und bekommen sogar ein vernünftiges Ergebnis für Mitglied (a, X). – nedned

+0

@humble kaffee: danke! Ich habe Prolog in den letzten paar Jahren kaum berührt, daher ist mein Wissen ein bisschen rostig :) – Stephan202

17

Da Sie nicht angeben, welche anderen Prädikaten wir verwenden dürfen, werde ich versuchen, ein bisschen zu betrügen.:P

member(X, L) :- append(_, [X|_], L). 
5
newmember(X, Xs) :- 
    phrase((..., [X]),Xs, _). 

Mit

... --> [] | [_], ... . 

Eigentlich ist die folgende Definition stellt auch sicher, dass Xs eine Liste ist:

member_oflist(X, Xs) :- 
    phrase((..., [X], ...), Xs).