Пролог Начинающий - PullRequest
       14

Пролог Начинающий

2 голосов
/ 03 декабря 2009

Я пытаюсь сделать предикаты такими, чтобы для списков X и Y rmlast был равен true, если X и Y - один и тот же список, за исключением того факта, что Y имеет на 1 элемент больше. Так [1] ​​[1,2] или [3,2] [3,2,5].

rmlast([], [_]). :- true.
rmlast([X|xtail], [Y|ytail]) :- rmlast(xtail,ytail), X is Y.

Это, однако, дает ложный результат для всего, кроме базового случая.

Ответы [ 2 ]

6 голосов
/ 03 декабря 2009

Ваш код не работает, потому что xtail и ytail написаны строчными буквами и, следовательно, не являются переменными. Это работает:

rmlast([], [_]).
rmlast([X|T1], [X|T2]) :- rmlast(T1, T2).

Кроме этого :

  1. Как видите, в этом случае нет необходимости иметь переменные X и Y: просто дважды используйте X в соответствующих местах.

  2. Вы пишете:

    rmlast([], [_]). :- true.
    

    Это так же, как:

    rmlast([], [_]).
    :- true.
    

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

1 голос
/ 09 апреля 2016
rmlast([H],[]).
rmlast([H1|Tail1],[H2|Tail2]):-
           H1 = H2,rmlast(Tail1,Tail2).

Не используйте «is», это не логический оператор. Это оператор присваивания. Вместо этого используйте «=».

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