Добрый день! Я хотел бы попросить помощи в понимании кода 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 вещи, которые я заметил было:
- Он не остановился в конце строки
- Очевидно, он не печатал всю доску, ему не хватало последней строки доски!
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
Честно говоря, я действительно потерян, и я был бы признателен за любые указания относительно того, с чего начать, или даже за последовательность действий для этой программы. Большое спасибо!