Достижение конца списка в прологе

sizeof дает размер переменной, не размер объекта, на который Вы указываете (если существует тот.) sizeof(arrayVar) возвратит размер массива в байтах, если и только если arrayVar объявляется в объеме как массив и не указатель.

, Например:

char myArray[10];
char* myPtr = myArray;

printf("%d\n", sizeof(myArray)) // prints 10 
printf("%d\n", sizeof(myPtr)); // prints 4 (on a 32-bit machine)
5
задан repeat 23 June 2015 в 08:13
поделиться

4 ответа

Well that, in the end, was rediculously easy to fix.

Here is the correct code.

ordered([]).

ordered([N, M|Ns]):-
 append([M], Ns, Tail),
 ordered(Tail),
 N =< M.

ordered([M]).

ordered([M]). deals with the single-element list as described above.

The real root of my problem was not including [] around the M in the append function.

Whats the ettiquette regarding awarding the correct answer? You've both helped muchly.

Jon

0
ответ дан 13 December 2019 в 05:39
поделиться

(предполагая, что это домашнее задание, я не решаюсь дать полное решение).

Глядя на ваш код, попытайтесь выяснить, как он объединит ? - Order ([1 ]). Выполните этот запрос мысленно (или используя trace / 0) и посмотрите, что он делает, шаг за шагом, и как вычисляет свой результат.

Кроме того, при продумывании пролога постарайтесь выкинуть из головы «возвращает значение». Предикаты Пролога ничего не возвращают.

5
ответ дан 13 December 2019 в 05:39
поделиться

Я думаю, что ваше решение не поддерживает хвостовую рекурсию. Подумайте что-нибудь подобное:

ordered([]) :-!.
ordered([_]):-!.
ordered([A,B|T]) :-
    A =< B,
    !,
    ordered([B|T]).
2
ответ дан 13 December 2019 в 05:39
поделиться

Вы совершенно правы: согласно вашему коду существует только два возможных способа упорядочивания списка :

  1. Пустой
  2. Первые два элемента находятся в правильном порядке, а остальная часть списка упорядочена

Это, безусловно, правильные утверждения, но как насчет списка [3]? Разве это не заказано и ? Очевидно, что список только с одним элементом упорядочен, но у вас нет возможности выразить это: он не подходит ни для вашего базового случая, ни для вашего рекурсивного случая.

Одноэлементный список - это еще один случай, скрытый здесь, который вы еще не рассмотрели . Поскольку это не зависит от двух правил, которые вы уже определили, вы можете рассмотреть способ отдельно рассмотреть этот особый случай.

1
ответ дан 13 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: