1

goodリストの各用語がペアノ数であるリストを取るルールで Prolog プログラムを作成しようとしています。リスト内の各要素が前の要素よりも大きい場合にのみ、ルールは true になります。

たとえば、次の例が当てはまる必要があります。

good([]).
good([0]).
good([0,s(0)]).
good([0,s(s(0))]).
good([0,s(0),s(s(0))]).

また、次の例は false である必要があります。

good([s(0),0]).
good([0,s(0),0]).

これが私のコードです:

plus(X,0,X).
plus(X,s(Y),s(Z)) :- plus(X,Y,Z).

geq(X,Y) :- plus(K,Y,X).
ge(X,Y) :- geq(X,Y), not(X = Y).

good([]).
good([X]).
good([H|T]) :- good(H,T).
good(X,[H|T]) :- ge(H,X), good(T).

ただし、正のクエリgood([0,s(0),s(s(0))])の場合、 true と false の両方がソリューションです。

エラーは何ですか?

4

1 に答える 1

1

この回答をご覧ください。最初に取得trueし、バックトラック後に取得falseすることは、答えが見つかったことを意味し、次に要求に応じて別のパスを試し、到達する他のパスが見つからなかったtrueため、返されfalseました。

つまり、その回答者が言うように、

応答は、false初心者の Prolog プログラマには一貫性がないように見え、エラーまたは警告のように「感じる」ことがありますが、実際には完全に正常な Prolog 応答です。

于 2014-02-03T15:04:27.950 に答える