2016-11-22 4 views
0

入力リストが空のときに私のプログラムが停止しない理由はありませんが、そのケースを処理できる事実があります。ここに私のコードです:私はこのような文字のリストを持っている私のリストが空のときにプロローグプログラムが停止しない

build_vps([], []). 
    build_vps([X | Ys], Zs):- 
      atom_number(X, C), 
      number(C), 
      build_vps(Ys, Zs). 
    build_vps([X, Y, Z | Ys], Zs):- 
      Y = '^', 
      atom_number(Z, C), 
      number(C), 
      build_vps(Ys, [v(C, X) | Zs]). 
    build_vps([X, Y, Z | Ys], [v(1, X)| Zs]):- 
      Y \= '^', 
      build_vps([Y, Z | Ys], Zs). 

[X、^「3]と私は、このVのような構造にそれらの文字を入れなければならない(3、X)。私はこれをbuild_vps([x、y、^、 '3']、R)のように呼んでいます。達成しようとしているのは、R = [v(1、x)、v(3、y)]です。

+1

トップレベルからどのように呼び出すことができますか?そして、あなたが達成しようとしていることの何らかの説明かもしれませんか? –

+1

最初の引数にリストを含む再帰的述語を書くときは、 'foo([] ...)'と 'foo([H | T]、..)という厳密な2つの節を持つことができますように、 。): - ...、foo(T、...)。 '。 –

+1

あなたは答えを編集して**正確に**ファイルのロード方法、クエリの実行方法、および何が起こるのかを表示する必要があります。今、私のために '? - build_vps([x、y、^、3]、R).'を実行しています('^'の後にコンマをつける必要があります) 'atom'が予想され、 '3'(整数)が見つかりました。だから私はあなたが私に与えたものであなたのエラーを再現することはできません。 –

答えて

0

停止します。それはあなたのルールに一致しないので、単にFalseと表示されます。

Yes, I know that but I don't get why. If u trace it, you'll see it keeps going when it reaches 0 elements in the first list.

それは、何を見ていると、あなたが行うには、このプログラムをしたいもののために十分な情報を提供しなかった、今

build_vps(Ys, [v(C, X) | Zs]). 

への呼び出しではありませんが、私は推測しています一度[y, ^, '3']を3番目のルールと一致させます。

このような場合は、プログラムが失敗した理由は、それがこの一致しないということです:build_vps(Ys, [v(C, X) | Zs]).

をあなたが試みることによってこれを確認することができます:build_vps([], [v(3, y) | Zs]).

これは簡単に3番目のルールを書き換えることで解決することができますこれは

+0

ありがとう、それは私のかなり愚かだった。今は動作しますが、リストに2つの要素しかないときにプログラムが機能しなかったので、新しいルールを追加しなければなりませんでした。ありがとう!! –

関連する問題