Как расширить драйвер пролога и определить количество столбцов и строк, прочитав файл eps - PullRequest
0 голосов
/ 28 апреля 2020

Добрый день! Я хотел бы попросить помощи в понимании кода Prolog, а также узнать, как расширить его функциональность. Основываясь на моих ограниченных, но все же начинающих ie знаниях в области программирования, функции первого заданного кода (очень похоже на основной файл), все происходит из него, и, таким образом, это первый файл, который запускается перед вызовом любой другой функции.

main.pl

printSequences([]).
printSequences([Sequence|Sequences]):-
    writeln(Sequence),
    printSequences(Sequences).

loadHelpers:-
    ['helpers'],
    ['part01'],
    ['part02'],
    ['part03'],
    ['part04'].

part01:-
    readExtremePegSolitaireFile('test04.eps',_,Game),
    printGame(Game),
    columnsAndRows(Game).

part02:-
    readExtremePegSolitaireFile('part01test01.eps',_,Game),
    printGame(Game),
    openSpaces(Game).

part03:-
    readExtremePegSolitaireFile('test04.single.eps',_,Game),
    printGame(Game),
    setof(Moves,fewestMoves(Game,Moves),AllMoves),
    writeln(moves),
    printSequences(AllMoves).

part04:-
    readExtremePegSolitaireFile('test04.eps',_,Game),
    printGame(Game),
    noIslands(Game).

Не думаю, что у меня есть какие-либо проблемы с пониманием первого приведенного выше кода, но моя проблема в основном с этим вторым приведенным кодом и с тем, как go манипулировать другими файлами. Кажется, я не могу понять префиксную часть (это определение списка списков?) Также я прав, что большинство других функций объявлены в этом вспомогательном файле, чтобы сделать код более организованным?

helpers.pl

:- module( helpers,
     [ readExtremePegSolitaireFile/3
     , printGame/1
     ]
    ).

prefix([H],[]).
prefix([H|T],[H|PreT]):-
    prefix(T,PreT).

readExtremePegSolitaireFile(File,Moves,Game):-
    open(File,read,Input),
    read(Input,Moves),
    readGame(Input,Temp),
    prefix(Temp,Game),
    close(Input).

readGame(Input,[]):-
    at_end_of_stream(Input),
    !.
readGame(Input,[Row|Rows]):-
    \+ at_end_of_stream(Input),
    read(Input,Row),
    readGame(Input,Rows).

printGame(Game):-
    writeln(game),
    printRows(Game).

printRows([]).
printRows([Row|Rows]):-
    writeln(Row),
    printRows(Rows).

Последняя - это доска пасьянсов колышков, которая дается с первой строкой, представляющей список выполненных ходов, а следующие строки являются объявлениями доски (1,2,3,4 - игроки, x - колышек и '-' как пустые места)

test04.eps

[r,d,u,r,l,l,l,d,l,u,r,r].
[2,-,x,x,x,x,x].
[x,x,-,x,-,x,x].
[x,3,x,-,x,-,x].
[x,-,4,x,x,x,x].
[x,x,-,x,x,-,x].
[x,x,x,1,-,x,x].
[x,x,x,x,x,x,x].

Я хотел бы знать, как можно было бы рассчитать количество столбцов и строк с помощью запроса columnsAndRows (Game). Мой первый план действий состоял в том, чтобы использовать что-то вроде этого: (Который мог бы рассчитать длину строк путем подсчета каждого элемента в списке, однако, похоже, что он рассчитал все элементы в списке. 2 вещи, которые я заметил было:

  1. Он не остановился в конце строки
  2. Очевидно, он не печатал всю доску, ему не хватало последней строки доски!
columnsAndRows(Game) :- 
    flatten(Game, FlatList),
    length(FlatList,FlatListSize),
    writeln(FlatListSize).

?- [a04tests].
?- loadHelpers.
?- part01.
game
[2,-,x,x,x,x,x]
[x,x,-,x,-,x,x]
[x,3,x,-,x,-,x]
[x,-,4,x,x,x,x]
[x,x,-,x,x,-,x]
[x,x,x,1,-,x,x]
42
true 

Честно говоря, я действительно потерян, и я был бы признателен за любые указания относительно того, с чего начать, или даже за последовательность действий для этой программы. Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...