2016-07-04 7 views
2

シンプルなプログラムがうまくいかないのはなぜですか?Prologのシンプルな四角形プログラム

main :- 
    squares([1,2,3,4,5], L), 
    writeln(L). 

squares([H|T], Outl) :- 
    Sq is H*H, 
    squares(T, [Sq|Outl]). 
squares([], []). 

出力は次のようになります。

?- main. 
false. 

は役立ちません(squares([H|T], Outl)に)[Outl]Outlを交換します。

代わりに=#=を使用するか、isを使用しても助けになりませんでした。

squares([], [])の代わりにsquares([], P)がありませんでした。

、あなたはあなたがリストTの残りの計算の結果でスクエアを追加

squares([H|T],[Sq|Outl]):- 
    Sq is H*H, 
    squares(T,Outl). 

書くべきあなたが

squares([H|T],Outl):- 
    Sq is H*H, 
    squares(T,[Sq|Outl]). 

SQは見当違いで書かれているもので

答えて

1

ルック

+0

がそれですあなたのシステムで作業していますか?私には、それは与えている:? - 四角([1,2,3,4,5]、L)。 L = [1 | _G1159]。 – rnso

+0

はい、動作します。 Out1をOutlに変更する必要があります(文字lではなく番号1)。ありがとう。 – rnso

+0

ありがとう、私は私の答えを編集する。 – joel76

4

これはmaplistの素晴らしい候補です。

一つの要素の二乗に定義します。

squared(X, XX) :- XX #= X * X. 

その後maplist適用されます。ここでは代わりのis/2#=を使用することにより

squared_list(L, LL) :- maplist(squared, L, LL). 

を、それは行動だが、よりリレーショナルです:

| ?- squared_list([1,2,3], L). 

L = [1,4,9] 

yes 
| ?- squared_list(L, [1,4,9]). 

L = [1,2,3] ? ; 

(1 ms) no 
| ?- 
関連する問題