Напишите пролог заказанного предиката - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь написать предикат, который успешно выполняется тогда и только тогда, когда числа в списке расположены в неубывающем порядке. Я с трудом пытаюсь понять это. Я знаю, что если каждый элемент меньше или равен предыдущему, то он должен вернуть false, но я теряюсь, как это сделать.

ordered(L) :- 

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018
ordered(L) :- ordered2(L).

% empty list is ordered
ordered2([]) :- true.
% list with one element is ordered
ordered2([_]) :- true.
% list is ordered if two first elements are ordered 
% and the rest of list is ordered
ordered2([A,B|T]) :- A=<B, ordered2([B|T]).
0 голосов
/ 27 апреля 2018

Рекурсия обычно должна быть вашей первой мыслью о приближении к любой проблеме в Прологе. Это значит:

  1. Определение базового случая, в котором вы можете легко определить, является ли предикат истинным или ложным

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

В простейших случаях рекурсивная логика заключается в простом применении некоторого теста к первому элементу списка; если он пройдет, рекурсивно примените предикат к остальной части списка.

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

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