Wie machst du eine Verschachtelte if-else-Anweisung im Prolog?
Wenn ich diese Funktion haben:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M ->
Output = 'true'
; Output = 'false'
).
aber was ist, wenn ich wollte auch überprüfen, ob N == M? Vielleicht so:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M ->
Output = 'true'
; ( N = M ->
Output = 'equal'
; Output = 'other'
)
).
Scheint nicht zu funktionieren.
- Was genau scheint nicht zu funktionieren? Sie bekommen Antworten, die Sie nicht erwarten, oder hat es nicht kompilieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Verschachtelung der Implikation (
->
) sieht richtig hier. Beachten Sie, dass in Ihrer definitionN
undM
werden ganze zahlen (vorausgesetzt, die Aufrufelength/2
beide erfolgreich), so kann verglichen werden mit==
statt der Vereinigung (=
). In der Tat, man könnte sogar arithmetische gleich in SWI-PROLOG, nämlich=:=
:Testen:
In verschachtelten if-then-else, es ist üblich, weglassen redundanter Klammern, nachgeben:
In Prolog ist es gute Praxis zu verwenden pattern-matching, wenn möglich, denn dies führt zu mehr Allgemeinen, deklarativer und lesbarere Programme als mit if-then-else. Für diesen speziellen Fall von Bedingungen, überprüfen Sie heraus die
compare/3
Bibliothek Prädikat.compare/3
können Sie verdinglichen das Verhältnis der beiden Längen in einem atom, und Sie können das atom zu beschreiben, die drei Bedingungen mit pattern-matching:Probe Abfragen und Ergebnisse:
->
,;
usw. üblich sind unter anderen PROLOG-Implementierungen, so dass diese nicht SWI-PROLOG-spezifisch ist (wahrscheinlich der Fall)?