2016-11-20 23 views
0

ベクトル長と2次元配列サイズを計算する関数を作った。Prolog '=='演算子は機能していませんか?

以下はその機能です。はい、私は意図的に詳細なlistLength, twoDarray機能を除外

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
write("vector len : "), write(COUNT1), 
write(", 2D array size : "), write(COUNT2). 

:私はSWI-プロローグを使用しています。

ただし、2つの関数は正しいです。したがって、COUNT1変数はベクトル長を格納し、COUNT2変数は2次元配列サイズを格納します。

また、入力変数LISTはベクトルを意味します。 2次元テーブルは固定されています(7 x 7)。

Iが入力してコードを実行します?

を - FOO([1、2、3、4、5])。

ベクトルLEN:5、2Dアレイサイズ:

それは出力Iは、以下のようなコードの上方に変更したとき、49

result(1)

しかし

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
(COUNT1 == COUNT2). 

機能は終了しません。私の目標はCOUNT1COUNT2です。 2つの変数が同じ場合はtrueが返され、そうでない場合はfalseが返されます。

しかし、同じ入力でも機能しません。この原因は何

result(2)

、そしてどのように私はそれを修正することができますか?

答えて

0

Prologインタプリタはゴールが失敗したときにバックトラックするので、COUNT2の別の値を返す場合があるので、twoDarray/1を再試行します。デフォルトでは、Prolog関係には複数の回答があります。特定のリレーションが関数であることをPrologマシンに伝える必要があります。つまり、1つの答えしか許されません。

リレーションが機能していることを伝えるには、カット演算子を使用できます。 twoDarray/1listLength/2の定義を変更しない場合は、定義をfoo/1に直接導入することができます。カット演算子は、感嘆符文字で示されます。私gprologと、私のSWI-プロローグと

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2),!, 
(COUNT1 == COUNT2). 
0

次のコード

listLength(_, 5). 
twoDarray(49). 

foo(LIST) :- 
    listLength(LIST, COUNT1), 
    twoDarray(COUNT2), 
    (COUNT1 == COUNT2). 

作品(すぐにエラーを返します)。

だから、あなたのlistLength/2またはtwoDarray/1に問題があると思います。

提案:listLength/2を私の偽のものに置き換えて、もう一度お試しください。

次は私のフェイクで試してくださいtwoDarray/1

関連する問題