Вывод функции Пролог - PullRequest
       11

Вывод функции Пролог

0 голосов
/ 07 февраля 2012

Я пытаюсь сделать функцию в прологе, чтобы добавить элемент в список списка. Я хочу добавить 1 элемент в конец первого списка, 2 элемента в конец второго списка и т. Д.

Я написал это для начала:

changerTableau(N,[Ligne|Reste],TableauVide,NouveauTableau):-
    repeter(N,'.',Point),
    append(Ligne,Point,NouvelleLigne),
    append(TableauVide,NouvelleLigne,NouveauTableau),
    writeln(N),
    N2 is N+1,
    writeln(NouveauTableau),
    changerTableau(N2,Reste,NouveauTableau,Output).

repeter(0,_,[]):-!.
repeter(N,Item,[Item|Reste]):-
    N2 is N - 1,
    repeter(N2,Item, Reste).

Итак, что я хочу, чтобы программа сделала, если я начну с этого:

changerTableau(1,[['x','w'],['a','b'],['l','o','l']],[ ],Resultat). 

Я хочу получить в выводе:

Resultat = [['x','w','.'],['a','b','.','.'],['l','o','l','.','.','.']]

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Ваш код содержит три ошибки:

  1. Переменная Output никогда не используется. На самом деле вы должны были получить предупреждение о том, что это переменная-одиночка. То, что вы хотите сделать, это сделать Output последним аргументом в заголовке changerTableau/4:

    changerTableau (N, [Ligne | Reste], TableauVide, выход): -

  2. Вы хотите построить список списков. Однако, когда вы добавляете NouvelleLigne к TableauVide, вы просто добавляете список к списку, в результате получается список, а не список списков. Вам нужно сделать это так:

    Append (TableauVide, [NouvelleLigne], NouveauTableau),

  3. Нет пункта changerTableau/4, который заканчивает рекурсию. Поэтому вы всегда получите no в качестве ответа. Добавьте это как первый пункт changerTableau/4:

    changerTableau (_, [], TableauVide, TableauVide).

Это должно заставить ваш код работать, хотя вы могли бы упростить его, чтобы полностью избавиться от append в пункте 2:

changerTableau(_, [], []).
changerTableau(N,[Ligne|Reste],[NouvLigne|NouvReste]):-
  repeter(N,'.',Point),
  append(Ligne,Point,NouvLigne),
  N2 is N+1,
  changerTableau(N2,Reste,NouvReste).
1 голос
/ 07 февраля 2012

вы также можете рассмотреть возможность использования maplist, если в вашей системе он есть:

changerTableau([], []) :- !.
changerTableau(List, [Head|Result]) :-
    maplist(append_(['.']), List, [Head|Tail]),
    changerTableau(Tail, Result).

append_(A, B, C) :- append(B, A, C).

Или с модулем лямбда :

changerTableau([], []) :- !.
changerTableau(List, [Head|Result]) :-
    maplist(\X^Y^append(X, ['.'], Y), List, [Head|Tail]),
    changerTableau(Tail, Result).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...