gpt4 book ai didi

java - 如何将java数组转换为prolog列表并用它进行jpl查询?

转载 作者:太空宇宙 更新时间:2023-11-04 09:51:29 26 4
gpt4 key购买 nike

我正在用 java 制作一个数独求解器,其核心使用一个小的 prolog kb。 prolog“数独”规则需要一个 prolog 列表。在java中,我有一个带有数独值的int[][]。

我已经使用列表的序言列表成功运行了查询例如Query q1 = new Query("problem(1, Rows), sudoku(Rows)."); 其中 Rows 是列表的序言列表,但我还需要让它与 Java int[][] 一起运行例如查询 q1 = new Query("sudoku", intArrayTerm);

相关java代码:

    int s00 = parseTextField(t00);
int s01 = parseTextField(t01);
...
int s87 = parseTextField(t87);
int s88 = parseTextField(t88);

int[] row0 = {s00, s10, s20, s30, s40, s50, s60, s70, s80};
...
int[] row8 = {s08, s18, s28, s38, s48, s58, s68, s78, s88};

int[][] allRows = {row0, row1, row2, row3, row4, row5, row6, row7, row8};

Term rowsTerm = Util.intArrayArrayToList(allRows);
Query q0 = new Query("consult", new Term[]{new Atom("/home/mark/Documents/JavaProjects/SudokuSolver/src/com/company/sudoku.pl")});
System.out.println("consult " + (q0.hasSolution() ? "succeeded" : "failed"));

// Query q1 = new Query("problem(1, Rows), sudoku(Rows).");
Query q1 = new Query("sudoku", rowsTerm);
System.out.println("sudoku " + (q1.hasSolution() ? "succeeded" : "failed"));

Map<String, Term> rowsTermMap = q1.oneSolution();
Term solvedRowsTerm = (rowsTermMap.get("Rows"));

parseSolvedRowsTerm(solvedRowsTerm);

序言代码:

sudoku(Rows) :-
length(Rows, 9), maplist(same_length(Rows), Rows),
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [A,B,C,D,E,F,G,H,I],
blocks(A, B, C), blocks(D, E, F), blocks(G, H, I).

blocks([], [], []).
blocks([A,B,C|Bs1], [D,E,F|Bs2], [G,H,I|Bs3]) :-
all_distinct([A,B,C,D,E,F,G,H,I]),
blocks(Bs1, Bs2, Bs3).


problem(1, [[_,_,_, _,_,_, _,_,_],
[_,_,_, _,_,3, _,8,5],
[_,_,1, _,2,_, _,_,_],

[_,_,_, 5,_,7, _,_,_],
[_,_,4, _,_,_, 1,_,_],
[_,9,_, _,_,_, _,_,_],

[5,_,_, _,_,_, _,7,3],
[_,_,2, _,1,_, _,_,_],
[_,_,_, _,4,_, _,_,9]]).

函数parseTextFieldparseSolvedRowsTerm,实际上是整个程序,可以与注释掉的Query q1一起正常工作,但不能与未注释掉的Query q1一起工作

最佳答案

解决了!向 q1 添加了一个额外参数感谢 github.com/zlumyo,为了方便我偷了他的 BuildMatrix,他的代码给了我额外参数的想法。

Query q1 = new Query("sudoku("+ buildMatrix(allRows) +", Result)");

“Buildmatrix”基本上只是一个 StringBuilder 辅助函数:

private String buildMatrix(int[][] cells) { // build matrix as string
StringBuilder result = new StringBuilder("[");

ArrayList<String> strList = new ArrayList<>();
for (int[] i : cells) {
strList.add(buildList(i));
}

result.append(String.join(",", strList));

result.append("]");

return result.toString();
}

private String buildList(int[] line) { // build matrix as string
StringBuilder result = new StringBuilder("[");

ArrayList<String> intList = new ArrayList<>();
for (int i : line) {
String stringval;

if(i == 0){
stringval = "_";
}else{
stringval = String.valueOf(i);
} // if statement is a small adaptation to the version github.com/zlumyo made, because my prolog sudoku had a slightly different format for the list.

intList.add(stringval);
}

result.append(String.join(",", intList));

result.append("]");

return result.toString();
}

序言代码没有太大变化,只是多了一个参数和 1 行。

sudoku(Rows, Result) :-
length(Rows, 9), maplist(same_length(Rows), Rows),
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [A,B,C,D,E,F,G,H,I],
blocks(A, B, C), blocks(D, E, F), blocks(G, H, I),
Rows = Result. %extra line

关于java - 如何将java数组转换为prolog列表并用它进行jpl查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54688982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com