In found_list(L) :- search_answer(A).
beide L
und A
Singletons sind. Ich nehme an, du hast die Warnung gesehen. Sie müssen das beheben, damit dieses Prädikat Sinn ergibt. Wollen Sie wirklich L = [Answer]
oder L = Answer
?
können Sie erreichen, was Sie nach dieser Art sind:
found_list(A) :-
search_answer(A).
Dies wird scheitern (Ergebnis in „nein“), wenn search_answer(A)
nicht gelingt, und Ihr Ergebnis wird A
sein, wenn es erfolgreich ist.
Wenn Sie das Ergebnis als eine Antwort innerhalb einer Liste möchten, können Sie dies tun:
found_list([A]) :-
search_answer(A).
Ich bin mir nicht sicher, was der Wert entweder von diesen ist. Die erste found_list/1
ist nur ein einfacher Wrapper auf search_answer/1
ohne zusätzliche Logik. Die zweite führt einfach eine Liste mit einzelnen Elementen aus dem search_answer/1
Ergebnis aus. Wenn A
bereits eine Liste ist, müssen Sie sie nicht in Klammern setzen ([...]
), sonst erhalten Sie nur eine Liste innerhalb einer Liste. Ich vermute, du versuchst wirklich etwas anderes zu tun, hast es aber nicht erklärt.
Als Antwort auf die Frage aktualisiert, soll der folgende Code arbeiten, wenn
A
ein einfacher ungebundener Begriff ist:
found_list(A) :-
search_answer(A),
is_list(A).
jedoch
wird is_list/1
gelingen, wenn ihr Argument auch eine Listenstruktur hat, obwohl es können Elemente sind sein ungebundener:
| ?- X = [_], is_list(X).
X = [_]
yes
| ?-
So zum Beispiel, wenn search_answer(A)
mit A = [_]
erfolgreich ist, dann wird found_list(A)
sucee d mit A = [_]
.
ground/1
nützlich sein kann, hier seit:
| ?- ground(X).
no
| ?- ground([_|_]).
no
| ?- ground([a,b]).
yes
| ?-
Somit sollte die folgende Lösung arbeiten:
found_list(A) :-
search_answer(A),
ground(A).
Wenn Ihre Absicht nicht zu
search_answer(A)
zurückzuverfolgen ist, wenn
A
nicht gemahlen, aber nur scheitern, könnten Sie implementieren
found_list/1
als:
found_list(A) :-
search_answer(A),
(ground(A) -> true ; !, false).
Ich denke jedoch, es könnte ein grundlegenderes Problem mit dem Code geben, da es kein Verhalten haben sollte, dass Sie dazu gezwungen fühlen, so zu arbeiten.
Es gibt keine Möglichkeit, dass 'found_list (L): - search_answer (A) .' unter allen Umständen zu 'L = [...]' führt, da Ihr Prädikat 'L' nicht instanziiert. Es wird nur gelingen oder fehlschlagen und Sie warnen, dass 'A' und' L' Singleton sind. Ich denke, das ist nicht das, was du rennst. – lurker
mein Tippfehler, ich meinte L, ich werde es korrigieren –
Es wird allgemein nicht als gute Praxis angesehen, um Code und Ergebnisbild-Snapshots zu veröffentlichen. Am besten bearbeiten Sie Ihre Frage und geben Sie neuen Code als Text und Ergebnisse als Text ein, es sei denn, Sie versuchen, ein grafisches Ergebnis anzuzeigen. – lurker