2016-04-02 18 views
0

私は以下のプロローグコードを持っています。私はこのルートプログラムでループを制御しようとするメンバーの述語を使用していますプロローグループ制御が期待通りに機能しない

link(b,brown,j) 

:リンク述語は、次のようなさまざまなリンクを含む別のファイルを参照します。アイデアは、私が以前にある位置にいた場合、プログラムはそのルートを下ろうとしないということです。

しかし、どこが間違っているかを調べるためにプログラムをトレースしようとすると、位置が位置リストのメンバーであるかどうかを確認するときに、最初の位置は既にリストに入っているので、その時点以降に別のルートがあってはならない場合。誰でもこれを修正する方法を知っていますか?

member(X,[X|_]). 
member(X,[_|Xs]):- member(X,Xs). 

route(X,X,[X],_). 
route(X,Z,[X|Path],Positions):- 
    link(X,Colour,Y), 
    \+member([Y,Colour],Positions),    
    route(Y,Z,Path,[[Y,Colour]|Positions]), 
    !. 
+0

してください、あなたの質問にvandalizeません。この投稿に問題がある場合は、カスタムフラグを立ててモデレータに警告することができます。 – Tunaki

+0

一度投稿したコンテンツを削除する権利はありません。自己破産を追及しようとしないでください。 – Magisch

答えて

3

いくつかのマイナーなコメントが最初にあります。そのカットは一切必要ありません。述部を正確に1つの回答に制限したい場合は、上部にあるonce/1を使用して行います。それは概念的にクリーンであるだけでなく、さらに効率的です。

その他の問題は、Prologの安全でない否定に関連しています。あなたが誤ってあなたがしたように、あまりにも一般的な目標を引き渡すなら、否定は常に失敗するでしょう。言い換えれば、否定はPrologで次に壊れてしまいます。 2つの方法があります。そのような場合にエラーを生成するか、単にnon_member/2のようなより良い定義を使用するかのいずれかです。

はのは、所定の位置にnon_member/2で起こっているだろうか見てみましょう:

link(b,brown,j). 

route(X,X,[X],_). 
route(X,Z,[X|Path],Positions):- 
    link(X,Colour,Y), 
    % \+member([Y,Colour],Positions), 
    non_member([Y,Colour],Positions), 
    route(Y,Z,Path,[[Y,Colour]|Positions]). 

non_member(E, Es) :- 
    maplist(dif(E), Es). 

| ?- route(X,Y,Path,Rs). 
    Y = X, Path = [X] 
; X = b, Y = j, Path = "bj", Rs = [] 
; X = b, Y = j, Path = "bj", Rs = [_A], 
    dif([j,brown],_A) 
; X = b, Y = j, Path = "bj", Rs = [_A,_B], 
    dif([j,brown],_A), 
    dif([j,brown],_B) 
; X = b, Y = j, Path = "bj", Rs = [_A,_B,_C], 
    dif([j,brown],_A), 
    dif([j,brown],_B), 
    dif([j,brown],_C) 
; X = b, Y = j, Path = "bj", Rs = [_A,_B,_C,_D], 
    dif([j,brown],_A), 
    dif([j,brown],_B), 
    dif([j,brown],_C), 
    dif([j,brown],_D) 
; X = b, Y = j, Path = "bj", Rs = [_A,_B,_C,_D,_E], 
    dif([j,brown],_A), 
    dif([j,brown],_B), 
    dif([j,brown],_C), 
    dif([j,brown],_D), 
    dif([j,brown],_E) 
; ... 

だから、すべての答えは同じPath = "bj"[b,j]ための短い形式)を記述する。しかし、最後の引数は、すべてが[j,brown]と異なる必要がある要素のリストです。だから、最高のはあったであろう:

route(X, Y, Path) :- 
    route(X, Y, Path, []). 

そして、ここではpath/4を再利用して別の定義です。私はあなたがこれらの色によって何を意味するのか本当にわかりません。それにもかかわらず:library(lambda)を使用して

clink(X-_, Y-Color) :- 
    link(X, Color, Y). 

route(X, Y, Path) :- 
    path(clink, Path, X-none, Y-_). 

かさえ短い:

route(X, Y, Path) :- 
    path(\ (Xl,_)^(Yl^C)^clink(Xl,C,Yl), Path, X-none, Y-_). 
関連する問題