私はプロローグを初めて使っています。私は完全に動作するマジックスクエアプログラムを作成しようとしていますが、真実を言うにはどうすればいいのか分かりません。それは間違っている。私は自分のコードを共有しています。誰かが私を助けてくれることを願っています。今は数字が良いときには本当ですが、そうでないときはスタックエラーのようになります...(ここでは、チェック) ご注意いただきありがとうございます!プログラミング1でマジックスクエアNxN
:- use_module(library(clpfd)).
:- use_module(library(lists)).
magicSq(List, N) :-
Number is N * N,
belongs(Number ,List), % check if numbers are correct.
all_different(List), % check if numbers not occur.
Suma is N*(N*N + 1)/2,
checkC(List,N,N,Suma), % check column
checkR(List,1,N,Suma). % check row
belongs(0, _).
belongs(N, List) :- member(N,List) , Index is N - 1 , belongs(Index, List).
consecutiveSum(_, 0 , _,0).
consecutiveSum(List, HowMuch , From,Sum):-
Index is HowMuch - 1,
From1 is From +1,
nth1(From, List,Element),
consecutiveSum(List,Index,From1,Z),
Sum is Z + Element,!.
sumObliCol(0,_, [], _,_). % sums by columns or obliquely
sumObliCol(X,Number, [H|T], Ind, Residue) :-
Index is Ind + 1,
Y is mod(Index,Number),
Y =:= Residue,
sumObliCol(Z,Number, T, Index,Residue),
X is Z + H, !.
sumObliCol(X,Number, [_|T], Ind,Residue) :-
Index is Ind + 1,
sumObliCol(X,Number, T, Index,Residue).
checkC(_,0,_,_). % check column
checkC(List,N, Number,Answ):-
N1 is N-1,
checkC(List,N1, Number,Answ),
sumObliCol(Ats,Number,List,0,N1),Ats is Answ,!.
checkR(_,N,Number,_):- N>(Number*Number). % check row
checkR(List,N,Number,Answ):-
consecutiveSum(List,Number,N,Sum), Sum is Answ,
N1 is N + Number,
checkR(List,N1, Number,Answ),!.
マジックスクエアを生成しようとしていますか、入力されたスクエアがマジックであるかどうかを確認していますか? – bendl
あなたのマジックスクエアのルールは何ですか?あなたのコードを見ると、私はそれらを推測することができますが、明示的に書き留めても害はありません。 –
別のこと:これは質問をする悪い方法です。あなたが実際に特定の問題を指摘すれば、可能な限り小さなコードで、あなたが解決しようとした方法を説明し、なぜそうすることができないのかを説明する方がずっと良いでしょう。現時点では、それは "コードレビュー"の問題であり、これはStackoverflowに属しません。 –