プロローグについてのちょっとした質問です。組み込みの述語findall/3
を使用してリストを取得し、変数X
を出力として使用したとします。
last/2
このリストの最後の要素を見つけるなど、別の述語でこのリストをどのように使用できるか疑問に思っています。小さな例も含めることができれば、非常に役立ちます。
プロローグについてのちょっとした質問です。組み込みの述語findall/3
を使用してリストを取得し、変数X
を出力として使用したとします。
last/2
このリストの最後の要素を見つけるなど、別の述語でこのリストをどのように使用できるか疑問に思っています。小さな例も含めることができれば、非常に役立ちます。
まず、Prolog は論理型プログラミング言語を目指しているため、出力変数などはありません。
それにもかかわらず、変数X
が特定の述語の後に境界付けられていることを知っていて、新しい述語を呼び出すときにこの値を使用するつもりだとすると、Prolog の論理 "and" ,/2
を使用できます。" and " を引用符で囲んでいます。これは、自然言語の "and" がどのように動作するかについての自然な理解とは異なる場合があるためです。
したがって、述語を使用できます。
findall(A,foo(A),X),last(X,L).
最初に のすべての出現箇所を見つけるにはfoo/1
、変数 を抽出し、A
これらをリストに入れX
、最後に のlast/2
要素を取得しますX
。
たとえば、定義済みの述語でこれを使用できます。
last_foo(L) :-
findall(A,foo(A),X),
last(X,L).
たとえば、これを次のように実行すると:
foo(a).
foo(9).
foo(b).
結果は次のとおりです。
?- foo(A).
A = a ;
A = 9 ;
A = b.
と:
?- findall(A,foo(A),X).
X = [a, 9, b].
最後を取得する結果は次のとおりです。
?- findall(A,foo(A),X),last(X,L).
X = [a, 9, b],
L = b.
また:
?- last_foo(L).
L = b.