2016-07-07 6 views
0

ここでは、gotまたはgiveは時間とともに入力されています。 私は最後のエントリであることを知るために次のコードを試しています:gotまたはgive?プロローグの最後のエントリを見つける

got(1). 
gave(2). 
got(3). 
gave(4). 
got(5). 
gave(6). 
got(7). 

isLastGot():- 
    findall(G, Got(G), Lg), 
    findall(A, Gave(A), La), 
    Lgg is lastElement(Lg), 
    Laa is lastElement(La), 
    Lgg > Laa. 

lastElement([H|T],A):-lastElement([T],A). 
lastElement([A],A). 

しかし、それは動作していない:

?- isLastGot(). 
ERROR: functor/3: Domain error: `compound_non_zero_arity' expected, found `isLastGot()' 
?- isLastGot. 
ERROR: toplevel: Undefined procedure: isLastGot/0 (DWIM could not correct goal) 
?- 

はどこに問題があるとどのようにそれを修正することができますか?

編集:私は、次を使用している場合は、私はロードにエラーが発生します。

isLastGot:- 
    findall(G, Got(G), Lg), 
    findall(A, Gave(A), La), 
    Lgg is lastElement(Lg), 
    Laa is lastElement(La), 
    Lgg > Laa. 

エラー:... /gotgave.pl:11:14:構文エラー:演算子が 多くの警告もありますが予想されますof:/ gotの句は、ソースファイル に含まれていません(与えられた/ 1の場合も同様の警告)

ファイルがロードされていません。

でも、すべてのGOTを入れて警告とエラーがメインのランタイムエラーがまだ持続され、離れて行っているもののすべてが、一緒に与えた後:

1 ?- isLastGot. 
ERROR: toplevel: Undefined procedure: isLastGot/0 (DWIM could not correct goal) 
2 ?- isLastGot(). 
ERROR: functor/3: Domain error: `compound_non_zero_arity' expected, found `isLastGot()' 
3 ?- 

これは関係なく、私がisLastGot()を使用するかどうかを示します。 - またはisLastGot: - 宣言で。

+0

'isLastGot()'はPrologで無効な構文です。 'isLastGot'を試してみてください。 *両方の*場所(宣言と呼び出し)。 – lurker

+0

それをisLastGotに修正しても、 - isLastGotを試してみてください。エラー:トップレベル:未定義プロシージャ:isLastGot/0(DWIMが目標を修正できませんでした) – rnso

+0

コードには多くの問題があります。 'Got(G)'と 'Gave(A)'の両方が大文字で表示されていることを示しています。これはエラーです。これらは 'got(G)'と 'give(A)'でなければなりません。私はこれを数回言いましたが、Prologの述語は関数*ではありません。彼らは機能のように振る舞いません。だから 'Lgg is lastElement(Lg)'は意味をなさない。 'lastElement(Lg、Lgg)'でなければなりません。不連続な述語についての警告も受け取ったでしょう( 'got'と' give'を交互に)。一部のプロローグでは、不連続なファクト/述部は無視されます。 – lurker

答えて

0

私はこのコードでいくつかの根本的な問題を引用しました。私はここでそれらをもっとはっきりと説きます。 (どのような「非連続」手段である)

あなたが「不連続」の述語に関する警告を見てする必要があり、上記のセクションで
got(1). 
gave(2). 
got(3). 
gave(4). 
got(5). 
gave(6). 
got(7). 

、または「一緒にいない」述語。これは、got/1とそれに続くgave/1を定義してからgot/1に戻るためです。 gotgaveが散在または挿入されています。多くのPrologの実装は不連続な定義を無視するので、これは問題です。あなたは事実を表現したい場合は、連続している必要があります。もちろん

got(1). 
got(3). 
got(5). 
got(7). 
gave(2). 
gave(4). 
gave(6). 

、私はこれが最後に来た1考え出すの問題の前提に反する実現。アサーションの順序を、ここでは2つの異なるファンクタだけで特定の一連のファクトを作成する手段として使用することは、良いアプローチではありません。配列をリストとして表現することは、[got(1), gave(2), got(3), gave(4), got(5), gave(6), got(7)]のようにもっと意味があります。その後、リストを処理します。

isLastGot():- 

これは基本的で無効な構文です。 Prologは引数がないことを示すために空のかっこを使用しません。正しいフォームはisLastGot :-

findall(G, Got(G), Lg), 
    findall(A, Gave(A), La), 

上記の2つのコールがおそらく誤字、誤りを持って、次のようになります。GotGaveが計上されるが、それらはすべきではありません。それらはgotgaveである必要があります。それは機能であるかのように

Lgg is lastElement(Lg), 
    Laa is lastElement(La), 

上記の二つの文はプロローグ述語を扱います。プロローグ述語ファンクションではなく、そのように呼び出すことはできません。次の2つの引数を持つlastElement/2を定義し、それを呼び出すための正しい方法は次のようになります。

lastElement(Lg, Lgg), 
    lastElement(La, Laa), 

最後に:

lastElement([H|T],A):-lastElement([T],A). 
lastElement([A],A). 

lastElement([T], A)コールはlastElement(T, A)でなければなりません。 Tは末尾が[H|T]なので、すでにリストになっており、[T]と表示しないでください。これは単なる要素のリストであり、それ自体がリストです。あなたの述語は書かれたとおりに動作しません。また、Prologにはすでにlast/2があります。これは正確にこれを行います。

+0

パーフェクト。すべての間違いを訂正した後で動作します。答えは?isLastGotです。 !ありがとう。 – rnso

関連する問題