Prolog 参数没有充分实例化

Prolog 参数没有充分实例化,prolog,instantiation-error,Prolog,Instantiation Error,我有一个任务,我必须用Prolog解决战列舰之谜。我当前的解决方案覆盖整个区域,并将一条船放置在它当前所在的坐标上。如果船的任何部分都不允许在那里(我只看给出的船件总数),它会放一些水 example(X) :- battleship( [ [n,_,'~',_,_,_,_,n], [_,_,n,'~',_,o,_,_], ['~','~',_,'~',_,_,_,s], [_,'~',x,'~',_,_,'~'

我有一个任务,我必须用Prolog解决战列舰之谜。我当前的解决方案覆盖整个区域,并将一条船放置在它当前所在的坐标上。如果船的任何部分都不允许在那里(我只看给出的船件总数),它会放一些水

example(X) :-
   battleship(
       [
        [n,_,'~',_,_,_,_,n],
        [_,_,n,'~',_,o,_,_],
        ['~','~',_,'~',_,_,_,s],
        [_,'~',x,'~',_,_,'~','~'],
        [_,_,_,'~',_,_,n,_],
        [_,_,_,'~',_,_,_,_],
        [_,_,_,x,_,'~',_,_],
        [_,_,_,_,_,_,_,_]
       ],
       [5,0,5,1,2,1,2,4],[2,4,2,3,2,1,4,2],[4,3,2,1],X).
上面这一行就是你所说的。第一个参数是带有
~
的字段,表示水,
表示未知,其他一切都是船的一部分。第二个参数是每列中的船只碎片的总和,第三个参数相同,但适用于行。第四个论点是船的大小,最后一个论点是我应该把结果放在哪里

battleship(Grid, Columns, Rows, Ships, Result) :-
    print(Result),
    fillField(Grid, Columns, Rows, Ships, Result).

fillField(Grid, Columns, Rows, Ships, Result) :-
    fillRows(Grid, Columns, Rows, Ships, Result, 0).

fillRows(Grid, Columns, Rows, Ships, Result, RowIndex) :-
    length(Grid, Length),
    RowIndex >= Length,
    print(Grid), print('\n'),
    print('Done\n').

fillRows(Grid, Columns, Rows, Ships, Result, RowIndex) :-
    length(Grid, Length),
    RowIndex < Length,
    fillRow(Grid, Columns, Rows, Ships, Result, RowIndex, 0),
    NextRow is RowIndex + 1,
    fillRows(Grid, Columns, Rows, Ships, Result, NextRow).

fillRow(Grid, Columns, Rows, Ships, Result, RowIndex, ElemIndex) :-
    print(Grid),print('\n'),
    length(Grid, Length),
    ElemIndex >= Length.

fillRow(Grid, Columns, Rows, Ships, Result, RowIndex, ElemIndex) :-
    length(Grid, Length),
    ElemIndex < Length,
    isLegalShip(Grid, RowIndex, ElemIndex),
    nth0(RowIndex, Rows, R1),
    R2 is R1 - 1,
    R2 >= 0,
    replace(Rows, RowIndex, R2, NewRows),
    nth0(ElemIndex, Columns, C1),
    C2 is C1 - 1,
    C2 >= 0,
    replace(Columns, ColumnIndex, C2, NewColumns),
    NextElem is ElemIndex + 1,
    fillRow(Grid, NewColumns, NewRows, Ships, Result, RowIndex, NextElem).

fillRow(Grid, Columns, Rows, Ships, Result, RowIndex, ElemIndex) :-
    length(Grid, Length),
    ElemIndex < Length,
    isSea(Grid, RowIndex, ElemIndex),
    NextElem is ElemIndex + 1,
    fillRow(Grid, Columns, Rows, Ships, Result, RowIndex, NextElem).


isLegalShip(Grid, RowIndex, ElemIndex) :-
    nth0(RowIndex, Grid, Row),
    nth0(ElemIndex, Row, Element),
    isShip(Element).    

replace([_|Tail], 0, Value, [Value|Tail]).
replace([Head|Tail], Index, Value, [Head|R]):- 
    Index > 0, 
    NextIndex is Index - 1, 
    replace(Tail, NextIndex, Value, R).

isSea(Grid, RowIndex, ElemIndex) :-
    nth0(RowIndex, Grid, Row),
    nth0(ElemIndex, Row, '~').
isShip(x).
isShip(o).
isShip(e).
isShip(s).
isShip(w).
isShip(n).
我只有一些基本的Prolog知识,不知道出了什么问题


如果您能提供任何帮助,我将不胜感激,我希望这个问题有点清楚。

fillRow/2
的第二条中,您有以下几行:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,
这里的
ColumnIndex
是一个单例,这意味着代码中没有其他地方可以以任何方式使用它。例如:您没有将其设置为任何值。这就是为什么在
replace/4
的第2条中,这一行有错误:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,

由于
索引
相当于
列索引
,因此未设置
索引
(未充分实例化),无法进行比较。因此,一个错误。

fillRow/2
的第二个子句中,您有以下行:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,
这里的
ColumnIndex
是一个单例,这意味着代码中没有其他地方可以以任何方式使用它。例如:您没有将其设置为任何值。这就是为什么在
replace/4
的第2条中,这一行有错误:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,

由于
索引
相当于
列索引
,因此未设置
索引
(未充分实例化),无法进行比较。因此,一个错误。

fillRow/2
的第二个子句中,您有以下行:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,
这里的
ColumnIndex
是一个单例,这意味着代码中没有其他地方可以以任何方式使用它。例如:您没有将其设置为任何值。这就是为什么在
replace/4
的第2条中,这一行有错误:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,

由于
索引
相当于
列索引
,因此未设置
索引
(未充分实例化),无法进行比较。因此,一个错误。

fillRow/2
的第二个子句中,您有以下行:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,
这里的
ColumnIndex
是一个单例,这意味着代码中没有其他地方可以以任何方式使用它。例如:您没有将其设置为任何值。这就是为什么在
replace/4
的第2条中,这一行有错误:

replace(Columns, ColumnIndex, C2, NewColumns),
Index > 0,

由于
索引
相当于
列索引
,因此未设置
索引
(未充分实例化),无法进行比较。因此,一个错误。

当执行比较运算符
/2
时,必须实例化所有参数。不能有变量。在执行比较运算符
/2
时,必须实例化所有参数。不能有变量。在执行比较运算符
/2
时,必须实例化所有参数。不能有变量。在执行比较运算符
/2
时,必须实例化所有参数。不可能有任何变量。好的,谢谢,我会重复一下阅读本文的其他人的错误。专栏索引应该是ElemIndex,这是一个论点。好的,谢谢,我会为其他阅读本文的人重复错误。专栏索引应该是ElemIndex,这是一个论点。好的,谢谢,我会为其他阅读本文的人重复错误。专栏索引应该是ElemIndex,这是一个论点。好的,谢谢,我会为其他阅读本文的人重复错误。ColumnIndex应该是ElemIndex,这是一个参数。