1

バックグラウンド

リストを調べて、P の 1 つの要素を除くすべてがゼロかどうかを判断する関係 power(P) を作成する必要があります。

ここに私が持っているものがあります:

%I have a relation called zero(P) which decides if every element is zero.

power([H|T]) :- H is not zero,  %The current element is non zero, the tail is all zero.
                zero(T).         
power([0|T]) :- power(T).       %The current element is zero, 
                                %but the tail has a non zero element in it.

一部のリソースは、バックトラッキングを制御するカット演算子 (!) の使用を提案していますが、それは私が探しているものではないと思います。

また、結果を交換するように見える証明不可能な演算子(\ +)に出くわしました(証明可能ではありません)、それも私が望んでいるものではないと思います。

Prolog Dictionaryは見つかりましたが、「not」の意味や使い方がわかりません (ご想像のとおり、Ctrl+F は「not」の多くのインスタンスを見つけます)。

質問

プロローグで「H はゼロではない」と言うにはどうすればよいですか?

EDITリストは整数のリストです。

4

3 に答える 3

1

引数が数値のリストであると仮定すると、単純に算術演算子を使用できます。

power([H|T]):- H =\= 0, zero(T).
power([H|T]):- H =:= 0, power(T).

一般的には、と書くこともできます\+ (H=0)。つまり、Hと統合することはできません0

問題は、この述語が数値のリストではないリストで呼び出された場合、どうしたいのかということです。上記のコードはエラーを引き起こします。そのような場合に失敗させたい場合は、次のように定義できます。

power([H|T]):- \+(H=0), zero(T).
power([H|T]):- H=0, power(T).
于 2013-03-05T21:03:57.747 に答える
0

「証明できない」演算子を使用した実用的なソリューション:

  zero([]).
  zero([0|T]) :- zero(T).

  power([H|T]) :- \+ zero(H), zero(T).         
  power([0|T]) :- power(T).
于 2013-03-05T21:13:26.707 に答える
0

zero/1 はかなり特殊な述語のようです。より慣用的な (高度な?) Prolog について学びたい場合は、library( apply )に基づく「ワンライナー」定義を検討してください。

power(L) :- include(=\=(0), L, [_]).

テスト:

?- power([0,99,0,0]).
true.

?- power([0,99,0,1]).
false.

もちろん、なぜそのような述語を「power」と名付けたのか想像できません...

于 2013-03-06T07:42:03.007 に答える