1

私はたくさんのことを試しましたが、プロローグで次の願いを実装する方法を見つけることができませんでした。

if list is empty
        call foo function
else
        do nothing

私がしたこと:

list = [] -> foo(...) 
             ;
             fail.

しかし、それは機能しません

4

2 に答える 2

3

fail「何もしない」という意味ではなく、「失敗する(そして後戻りする)」という意味です。

true代わりに使用する必要があります:

( List == [] -> foo(...) ; true ),

また、List変数である必要があるため、大文字を使用してください。

于 2012-06-04T08:08:27.537 に答える
0

これを書く別の、おそらくもっと慣用的な方法は、

% foo_if_empty(?List)  call foo if list is empty
foo_if_empty([]) :- !,foo(...).
foo_if_empty(_).

私のコードが行うことは、リストが空の場合に最初の句と統合することです。

もしそうなら、私たちはカットを行います。fooが失敗した場合、mypredを成功させたくありません。したがって、2番目の句は実行しません。カットはその可能性を排除します。

さて、最初の節と統合しなければ、確かに2番目の節と統合します。そして、それは何もしません。

これは、->を使用するよりも、Prologでif / then/elseを実行するためのはるかに慣用的な方法です。->は通常、中括弧言語の?:演算子のように、コードを啓蒙するのではなく、別のpredを導入するとわかりにくくなる状況で使用されます。

于 2012-06-05T16:45:35.647 に答える