Frage

Ich verstehe, dass ich, um herauszufinden, meine eigenen Hausaufgaben brauchen, aber, dass niemand in der Klasse zu sehen, kann es herausfinden, ich brauche etwas Hilfe.

  

Schreiben Sie ein Prolog-Programm, so dass p(X)   wahr ist, wenn X eine Liste bestehend aus n   a wird von n+1 b Jahren folgt, für jeden n >= 1.

War es hilfreich?

Lösung

Sie sollten einen Zähler verwenden, um zu verfolgen, was Sie bisher gefunden haben. Wenn Sie eine b finden, fügen Sie eine an den Zähler. Wenn Sie eine a finden, eine subtrahieren. Der Endwert des Zählers, nachdem die gesamte Liste sollte man durchquert werden, da Sie die Anzahl der b wollen ist 1, mehr zu sein als die Anzahl der a ist. Hier ist ein Beispiel dafür, wie das zu schreiben, in dem Code ein:

% When we see an "a" at the head of a list, we decrement the counter.
validList([a|Tail], Counter) :-
  NewCounter is Counter - 1,
  validList(Tail, NewCounter).

% When we see an "b" at the head of a list, we increment the counter.
validList([b|Tail], Counter) :-
  NewCounter is Counter + 1,
  validList(Tail, NewCounter).

% When we have been through the whole list, the counter should be 1.
validList([], 1).

% Shortcut for calling the function with a single parameter.
p(X) :-
  validList(X, 0).

Nun wird dies tun, fast , was Sie wollen - es passt die Regeln für alle n >= 0, während Sie es für alle n >= 1 wollen. In typischer Hausaufgaben Antwort Art und Weise, ich habe links die letzte Bit für Sie selbst hinzufügen.

Andere Tipps

Ich erinnere mich nicht, wie man Code diesen in Prolog, aber die Idee ist diese:

Regel 1: Wenn LISTSIZE 1, return true, wenn das Element ein B ist.

Regel 2: Wenn LISTSIZE 2, return false.

Regel 3: Überprüfen Sie, ob der erste Eintrag in der Liste ein A ist und die letzte ist ein B. Wenn dies wahr ist, geben Sie die Lösung für Elemente 2 bis LISTSIZE-1.

Wenn ich das Problem richtig verstanden, dass die perfekte Prolog Stil Lösung sein sollte.

Edit: Ich habe ganz vergessen darüber. Ich bearbeitete die Antwort den Fall von n = 1 und n = 2. Dank Heath Hunnicutt zu berücksichtigen.

Hier ist meine abstruse Lösung

:-use_module(library(clpfd)).

n(L, N) -->
    [L],
    {N1 #= N-1
    },
    !, n(L, N1).
n(_, 0) --> [], !.

ab -->
    n(a, N),
    {N1 is N + 1
    },
    n(b, N1).

p(X) :- phrase(ab, X).

test :-
    p([b]),
    p([a,b,b]),
    p([a,a,b,b,b]),
    p([a,a,a,b,b,b,b]),
    \+ p([a]),
    \+ p([a,b]),
    \+ p([a,a,b,b]),
    \+ p([a,b,b,c]).

Prüfung:

 ?- [ab].
% ab compiled 0.00 sec, -36 bytes
true.

 ?- test.
true.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top