2017-12-16 20 views
2

私はリストを取り、エッジの述語を返すPrologに句を書き込もうとしています。例:プロローグのタプルにリスト

?- listpairs([1, 2, 3], X, Y). 
X = 1 
Y = 2; 

X = 2 
Y = 3; 

これは私がこれまで試みてきたもので、どこにもいない。

listpairs([H], H, H). 
listpairs([H1,H2|T], X, Y) :- 
     X is H1, 
     Y is H2, 
     listpairs([H2|T], X, Y). 

誰かが助けてくれれば幸いです。

+0

お使いのベースケースは理にかなっていますか?それはあなたが欲しいものですか?再帰的な場合には、論理和を追加する必要があります。値を返すか、再帰的に呼び出すか、両方を呼び出す必要があります。 –

+1

* ...どこにも*いない*。非常に良い問題の説明ではありません。 – lurker

答えて

2

問題が書き込みであることです。その価値はさらにそう再帰の次の反復では、あなたが再インスタンス化しようとするので、あなたの述語はフェアう変更できないことを意味している

X、Yがインスタンスを取得X、Y。

試してみてください。

listpairs([H1,H2], H1, H2). 
listpairs([H1,H2,_|_], H1, H2). 
listpairs([_,H2|T], X, Y) :- listpairs([H2|T], X, Y). 

例:

?- listpairs([1, 2, 3, 4, 5], X, Y). 
X = 1, 
Y = 2 ; 
X = 2, 
Y = 3 ; 
X = 3, 
Y = 4 ; 
X = 4, 
Y = 5 ; 
false. 
+0

それは働いた!どうもありがとうございます! – user287474

+0

あなたが歓迎して、同じ答えを2回与える前に答えを編集して、それを修正して、喜んで助けてください! – coder

+0

算術式を評価していないときには 'is/2'を使わないでください。代入のためには' =/2'だけを使用してください。 listpairs([H1、H2、_ | _]、X、Y): - listpairs([H1、H2、_ | _、H1、H2) X = X1、Y = H2である。 – coder

関連する問題