2017-03-31 4 views
0

Wie kann ich Prolog Antwort Nein machen, wenn search_answer keine Antwort gefunden hat, und Ja mit L = [Antwort]Prolog Antworten Argument = Argument, statt Antwort Nein

search_answer: Prädikat, das zurückgibt eine Liste oder lass uns A als freie Variable.

found_list(L) :- 
    search_answer(L). 

Wenn zum Beispiel found_list(L) gefragt, obwohl search_answer keine Antwort gefunden hat, antwortet Prolog noch Ja. Ich drucke L, und es ist gleich _496, eine freie Variable.

das obige Stück Code gegeben, found_list Antworten L = [...] wenn search_answer eine Liste gefunden wird, gibt sonst L = L, während ich keine

ich folgendes versucht beantworten wollen, funktioniert aber nicht

found_list(L) :- 
    search_answer(L) , is_list(L). 

enter image description here

liar_detector ist mein search_answer Prädikat, mit L = answer und Lügner ist mein found_answer

+0

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

+0

mein Tippfehler, ich meinte L, ich werde es korrigieren –

+1

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

Antwort

2

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.

+0

L = Antwort ist was ich will. Ich werde mit einem Beispiel aktualisieren –

+0

funktioniert immer noch nicht, siehe mein Update bitte –

+0

@ HakiTerror das Code-Bild, das Sie mir gezeigt haben, ist nicht klar. Sie haben ein Problem mit Ihrem Code, aber Ihr vereinfachtes Beispiel beschreibt es nicht richtig. Bitte erläutern Sie deutlich, was Ihr aktuelles Prädikat tun soll. – lurker

Verwandte Themen