如何在prolog中创建列表,其大小由用户

时间:2015-12-17 13:32:30

标签: list prolog

我正在Prolog中写一个游戏。游戏中有一个如下所示形式的“棋盘”,它有两个“棋子”列表。电路板的尺寸固定为16个位置。我想让棋盘“动态”,所以当游戏开始时,用户将定义大小。 我想到了一种方法,但问题是我的方式更多的是程序方式,而Prolog并不正确。 我想创建一个谓词大小/ 1,它将由用户在开始时初始化,然后所有列表将根据该谓词使用重复和剪切并断言来初始化... 有人可以提出更好的实施吗?

/*--------------------------------------------------------------------------
Initial armies (lists of 1 to 8)
--------------------------------------------------------------------------*/
black_army([1,2,3,4,5,6,7,8]).
white_army([1,2,3,4,5,6,7,8]).

/*--------------------------------------------------------------------------
Initial Board (all positions empty)
--------------------------------------------------------------------------*/
board([
    (1,-,-),(2,-,-),(3,-,-),(4,-,-),
    (5,-,-),(6,-,-),(7,-,-),(8,-,-),
    (9,-,-),(10,-,-),(11,-,-),
    (13,-,-),(14,-,-),(15,-,-),(16,-,-),(12,-,-)
]).

1 个答案:

答案 0 :(得分:0)

我认为我会在数据声明中隐藏电路板大小,只需将其设置为动态,并在用户请求更改时进行初始化:所以,保持代码不变,只需在前面添加(注意:未经测试的代码)

:- dynamic(black_army/1).
:- dynamic(white_army/1).
:- dynamic(board/1).

initialize_data(Size) :-
  Size > 1, % this should be a sensible value, of course
  retract(black_army(_)), 
  retract(white_army(_)),
  retract(board(_)),
  numlist(1,Size,B),
  assertz(black_army(B)),
  numlist(1,Size,W),
  assertz(white_army(W)),
  D is Size*2, findall((I,-,-), between(1,D,I), Board),
  assertz(board(Board)).