Как я могу объединить этот список вместо того, чтобы просто добавить в него больше переменных? - PullRequest
0 голосов
/ 27 апреля 2019

Я делаю проект в колледже и пытаюсь использовать Пролог, в этом случае мне нужно бегать по элементам списка три на три, но мне не удалось объединить список справильные переменные (X, Y, Z) и моя программа продолжает добавлять все больше и больше переменных в список.

aplica_R1_fila_aux(Fila, N_Fila) :-
   copia(Fila, N_Fila).
aplica_R1_fila_aux(Fila, [X,Y,Z|T]) :-
   aplica_R1_Triplo([X,Y,Z], F),
   aplica_R1_fila_aux(Fila, T).

Этот код должен скопировать список Fila в N_Fila, а затем объединить [X, Y, Z |T] с N_Fila и измените список, но вместо этого он просто добавляет переменные в N_Fila.

1 Ответ

0 голосов
/ 30 апреля 2019

Основной трюк, который вам нужен для этой работы, заключается в том, что вы можете использовать call/N с различным количеством аргументов.Так что, как только вы сняли X, Y и Z, вы можете получить результат ваших Goal против них с помощью call(Goal, X, Y, Z, Result).

Есть несколько способов сделать это, ноЯ бы предпочел просто составить три списка и повторить все три.Когда самый правый истощен, вы закончили возвращаться.Это дает вам меньше базовых случаев для беспокойства (списки без, один или два элемента не должны обрабатываться отдельно), и нет никаких сокращений, поэтому ваш код будет выглядеть так:

map3(Goal, [X,Y,Z|L], Solutions) :-
    map3(Goal, [X,Y,Z|L], [Y,Z|L], [Z|L], Solutions).

map3(_, _, _, [], []).
map3(Goal, [X|XR], [Y|YR], [Z|ZR], [R|Rest]) :-
    call(Goal, X, Y, Z, R),
    map3(Goal, XR, YR, ZR, Rest).

Это также может быть решено без предиката-помощника, но кое-что оскорбило меня, и это не должно быть намного хуже с точки зрения затрат, так что я пошел по этому пути.

С пустышкойцель foo(X,Y,Z, foo(X,Y,Z)), я получил этот пример запроса и результата:

?- map3(foo, [a,b,c,d,e,f], Result).
Result = [foo(a, b, c), foo(b, c, d), foo(c, d, e), foo(d, e, f)] ;
false.

Я думаю, что это в основном то, что вы пытаетесь получить, дайте мне знать, если я смогу что-то уточнить.

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