Присвоение переменной в рекурсии - PullRequest
0 голосов
/ 15 декабря 2018

Учитывая это:

useAdd(List, What) :-                                         
    addToList(List, What, New),                               
    reverseList(New, T),                                      
    write("done "),                                           
    write(T), nl, !.                                          

addToList(List, What, [ What | List]).                        

reverseList([], List) :- write(List), nl.                     
reverseList([H | Old], []) :- reverseList(Old, [ H ]).        
reverseList([ H | Old], New) :- reverseList(Old, [ H | New]). 

Почему это происходит (в swipl)?

?- useAdd([42, 100, ok], hello).
[ok,100,42,hello]
done []
true.

Очевидно, что присвоение New в useAdd означало что-то, потому что правильноесписок передается на reverseList.Но тогда, в отличие от New, T в useAdd пусто.

  • Чем эти два задания отличаются?Почему один работает, а другой нет?
  • Как получить обратный список в T в useAdd?

1 Ответ

0 голосов
/ 15 декабря 2018

Ваше определение reverseList/2 использует T в качестве хвоста обратного списка.Перевернутый список создается и печатается на самом глубоком уровне рекурсии, а затем с этим созданным значением ничего не делается:

2 ?- reverseList( [1,2,3,4], [0]).
[4,3,2,1,0]
<b>true</b>.

Вместо этого передайте его как свежую логическую переменную в качестве третьего параметра passон остается неизменным между вызовами и, наконец, устанавливает его на самом глубоком уровне:

reverseList([], List, T) :- <b>List = T</b>, write(List), nl. 
reverseList([H | Old], [], T) :- reverseList(Old, [ H ], T).
reverseList([ H | Old], New, T) :- reverseList(Old, [ H | New], T). 

Затем назовите его как reverseList( [1,2,3,4], Newtail, T), чтобы установить T на самом глубоком уровне рекурсии:

6 ?- reverseList( [1,2,3,4], [0], T).
[4,3,2,1,0]
T = [4, 3, 2, 1, 0].

Определение повсеместно, наименование ужасное, и оно использовало T, вероятно, для "хвоста", поэтому вы должны назвать новый аргумент как-то вроде R, чтобы, по крайней мере, намекнуть натот факт, что он будет содержать перевернутый список как результат вызова.

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