3

これはプロローグの私の最初のプログラムです。私はそれについて読んでいますが、いくつかのコアコンセプトを把握していないようです(私は思います)。2 つのリストを取り、最初のリストにさらに要素がある場合にのみ true を返すファンクターを作成しようとしています。いくつかの簡単なプログラムが動作するようになりましたが、ここで障害にぶつかりました。isLonger 内でサイズを呼び出し、一時変数をサイズの戻り値に設定しようとしています。これは、プロローグでこれを行う悪い(そして正しくない)方法のようです。私は得ています:

ERROR: >/2: Arguments are not sufficiently instantiated

% List 1

a([cat, dog, horse]).
b([1, 2, 3, 4]).
c([x, [a, b], y, z]).
c([red, yellow, green, blue]).


% isLonger function
isLonger([],[]).
isLonger(L1,L2) :-  A = size(L1,N), B = size(L2,N), A > B.

 % size([],N).
size([_|T],N) :- size(T,N1), N is N1+1.

入力:

isLonger([x,y,z], [7,8,9,10]).

4

1 に答える 1

3

リストは空ではなく、空の場合L1よりも長くなります。または の尾がの尾よりも長い場合。L2L1L2L1L2

longer([_|_], []).
longer([_|T1], [_|T2]) :- longer(T1, T2).

残念ながら、この解決策では、最初の引数のみで述語をインデックス化できるいくつかの Prologs で選択ポイントが失われてしまいます。これは、引数の順序を逆にするだけで解決できます。

longer(L1, L2) :- shorter(L2, L1).
shorter([], [_|_]).
shorter([_|T1], [_|T2]) :- shorter(T1, T2)
于 2013-11-12T09:13:41.353 に答える