2016-04-23 6 views
-1

Prologにはあまり慣れていないが、非常に未知のプログラミング言語を開発するためのエクステンションとしてプログラミング言語を使用している。私の問題は次のとおりです。私はPrologのクエリーリストを原則として定義してからPrologの最初の要素を取得

([Head|Tail]) = ([a,b,c]). 

で書くことができるという事実をよく知っていますし、これは私がしかし

Head = a, Tail = b,c. 

を得ることになり、これは私が必要なものはかなりではありません。 私はプログラムからリストを受け取るボットを書いています。このリストは、基本的にはボットが処理してプログラム内のリストのすべての要素を見つけ出し、それを環境と呼ぶものです。今私の問題は次のとおりです:

私はそのリストの最初の要素を取得する方法のいくつかのルールを定義することはできないようです。私はあらゆることを試みてきました。最初のステートメント:

parameterList([a,b,c,d]. 

nextElement(X) :- parameterList(Z), member(Z,X). 

は動作していないようです。なぜこれは機能しないのですか?私はどちらかを理解することができなかったので、私は事前に次の質問をします。環境から私はパラメータindexOfNextElement(B)を取得します。これはリストのどの要素を取り出す必要があるかの値を返します。もちろん、それは0から始まり、いったんこのものがボットによって提供されると、インデックスは上がります(これは自動的に進みます)。再び

私はプロローグに非常に新しいですので、そこに私が間違っているの構文のすべてをやっているの良いチャンスだが、私が

+0

'member(X、Z) 'にする必要があります。 –

+2

'([Head | Tail])=([a、b、c])。 'では、かっこは余分です。あなたは '' [Head | Tail] = [a、b、c] 'と書くことができます。あなたのコメントは次のように書かれています:*リストの最初の要素を取得する方法についていくつかのルールを定義できないようです* *。*しかし、それ以前のあなたの例のクエリはまさにそれを行います。リストが 'L'の場合、' L = [First | Rest] 'は' First'が 'L'の最初の要素になり、' Rest'がリストの残りの部分になります。あなたのその後の質問では、*環境から私はパラメータ 'indexOfNextElement(B)' *を得ると言います。 「環境から」という言葉が何を意味するのかは不明です。 – lurker

答えて

3

あなたが配置されている方法でそれを行う方法を見つけ出す手助けするために驚くべきだろうメンバー/ 2内の引数[a,b,c,d]はリストZのメンバーです。あなたは引数を反転した場合

?- nextElement(X). 
X = [[a,b,c,d]|_A] ? ; 
X = [_A,[a,b,c,d]|_B] ? ; 
... 

:それを照会する場合したがって、あなたはリストで置換変数Xを取得

nextelement(X) :- 
    parameterList(Z), 
    member(X,Z). 

結果は私がしたいと思うものです:

?- nextelement(X). 
X = a ? ; 
X = b ? ; 
X = c ? ; 
X = d ? ; 
no 

として、これは、基本的に、リストとインデックスとの間の関係です。

:- use_module(library(clpfd)). 

list_nth_element(L,N,E) :- 
    list_nth_element_(L,N,E,0).   % the first index is 0 

list_nth_element_([H|_T],N,H,N).  % element at index N 
list_nth_element_([_H|T],N,E,Pos0) :- 
    N #> Pos0,       % position differs from index 
    Pos1 #= Pos0 + 1,     
    list_nth_element_(T,N,E,Pos1).  % E must be in the tail 

これはさまざまな方法でクエリできます。どの要素がどのような指標である?:

?- list_nth_element([a,b,c,d],N,E). 
E = a, 
N = 0 ? ; 
E = b, 
N = 1 ? ; 
E = c, 
N = 2 ? ; 
E = d, 
N = 3 ? ; 
no 

要素cあるインデックスで1?:

?- list_nth_element([a,b,c,d],1,E). 
E = b ? ; 
no 

された位置で、どの要素:?

一般に
?- list_nth_element([a,b,c,d],N,c). 
N = 2 ? ; 
no 

、あなたの場合すべてのリストの要素で何かしたい場合は、そのようなパターンに従うことができます:

predicatename([],...). 
predicatename([H|T], ...) :- 
    % do something with H here 
    predicatename(T,...). 

ルールの先頭と再帰的なゴールには...があることに注意してください。ここにあなたの関係の追加引数を配置します(上記のlist_nth_Element/3を参照)。クエリする内容に応じて、引き数を変数として残し、Prologはその変数を一度に1つずつリレーションに置き換えます(上記のクエリの例を参照)。

あなたのコメントについて:上記の質問は、list_nth_element/3を使用する方法の例です。もちろん、あなたも自分のロボットの述語に目標としてそれを使用することができます。

robotpredicatename(...) :- 
    ... 
    % you get the list somewhere here 
    ... 
    list_nth_element(L,N,E), 
    ... 

をゴールlist_nth_element/3あなたの述語が関心のリストを取得し、それを変数にバインドどこか前に、Lは言います。リストが利用可能になると、list_nth_element/3とLを使用して目的の位置に要素を取得できます。あるいは、上記のパターンを使用して、list_nth_element/3の代わりに述語を書くことができます。これはリストの各要素で何かを行います。

+0

このsulutionの最大の問題は、私が使うことができるプロローグクエリがありません。だから私はプロローグクエリでリストを定義することはできません。代わりに私のロボットがリストを評価しています。それはリスト内の要素を知っており、受け取る要素を知っています。私はちょうど1つのルールにthis_element(Element)ルールを入れる適切な方法を見つけることができません –

関連する問題