私はたくさんのことを試しましたが、プロローグで次の願いを実装する方法を見つけることができませんでした。
if list is empty
call foo function
else
do nothing
私がしたこと:
list = [] -> foo(...)
;
fail.
しかし、それは機能しません
私はたくさんのことを試しましたが、プロローグで次の願いを実装する方法を見つけることができませんでした。
if list is empty
call foo function
else
do nothing
私がしたこと:
list = [] -> foo(...)
;
fail.
しかし、それは機能しません
fail
「何もしない」という意味ではなく、「失敗する(そして後戻りする)」という意味です。
true
代わりに使用する必要があります:
( List == [] -> foo(...) ; true ),
また、List
変数である必要があるため、大文字を使用してください。
これを書く別の、おそらくもっと慣用的な方法は、
% 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を導入するとわかりにくくなる状況で使用されます。