Interview-Frage!
Dies ist, wie Sie normalerweise definieren die member
relation in Prolog:
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, die es mit nur einer Regel.
InformationsquelleAutor der Frage Claudiu | 2009-11-16
Lösung:
Demonstration:
Wie es funktioniert:
X
in dem das zweite argument,[Y|T]
.Y
entspricht Ihrem Kopf,T
entspricht den Schwanz.X = Y
(d.h.X
werden kann, vereint mitY
) fanden wir dann auchX
in der Liste. Ansonsten (;
) wir testen, obX
ist in den Schwanz.Bemerkungen:
=
(Vereinigung) Erträge flexibler code als mit==
(Test auf Gleichheit).Dieser code kann auch verwendet werden, um aufzählen der Elemente einer gegebenen Liste:
Und es kann verwendet werden, um "auflisten" alle Listen enthalten, die ein gegebenes element:
Ersetzen
=
durch==
im obigen code macht es viel weniger flexibel: es würde sofort scheiternmember(X, [a])
führen und einen stack-überlauf aufmember(a, X)
(getestet mit SWI-Prolog-version 5.6.57).InformationsquelleAutor der Antwort Stephan202
Da Sie nicht angegeben, welche anderen Prädikate, die wir erlaubt sind zu verwenden, ich werde versuchen zu betrügen, ein bisschen.
:P
InformationsquelleAutor der Antwort bcat
Mit
Tatsächlich, die folgende definition sorgt auch dafür, dass
Xs
ist eine Liste:InformationsquelleAutor der Antwort false