?のような組み込みの述語を使用せずに、指定された値がPrologの数値であるかどうかを確認するにはどうすればよいnumber
ですか?
リストがあるとしましょう[a, 1, 2, 3]
。このリスト内のすべての要素が数値であるかどうかを確認する方法が必要です。number
私を悩ませている問題の唯一の部分は、述語を使用せずにチェック自体を実行する方法です。
私がこれを理解しようとしている理由は、組み込みの述語を使用しないように特に言われている大学の課題を持っているからです。
この問題を解決するには、いくつかの組み込み述語が必要です。ただし、すべての数値を明示的に列挙しない限り(無限に多数あるため、実用的ではありません)。
最も簡単な方法は次のとおりです。
maplist(number, L).
または、再帰的に
allnumbers([]).
allnumbers([N|Ns]) :-
number(N),
allnumbers(Ns).
コメントであなたは「値はアトムとして与えられる」と言います。これは、[a、 '1'、'2']または'[a、1、2]`のいずれかを取得することを意味する可能性があります。私は最初のものを想定しています。ここでも、名前を分析するための組み込みの述語が必要です。ISO-Prologのエラーに依存して私たちは次のように書いています。
numberatom(Atom) :-
atom_chars(Atom, Chs),
catch(number_chars(_, Chs), error(syntax_error(_),_), false).
numberatom/1
の代わりに使用するnumber/1
ので、再帰ルールを作成するか、maplist/2
catch...
目標の代わりに文法を書きたいと思うかもしれません。最近そのような定義がたくさんあります、あなたはこの質問を見るかもしれません。
「値」全体がアトムとして指定されている場合は、もう一度必要になるatom_chars/2
か、のような実装固有のソリューションが必要になりatom_to_term/3
、上記のソリューションの1つを適用することができます。