Определите, стоит ли объект перед другим объектом в списке - PullRequest
1 голос
/ 21 февраля 2020

У меня есть это предложение, которое говорит, что объект находится непосредственно перед другим объектом в списке. Я ищу руководство о том, как обобщить это, чтобы быть объектом, который находится в любом месте перед объектом в списке (не обязательно слева от него сразу). Тогда я хочу иметь возможность также проверить после.

% Checks that `X` comes before `Y`
% in the list `Ds`
before(X,Y,Ds) :-
    remainder(X,Ds,Rs),
    member(Y,Rs).

% Finds a member of a list and
% unifies the third parameter such
% that it is the remaining elements in
% the list after the found member
remainder(X,[X|Ds],Ds).
remainder(X,[_|Ds],Rs) :- remainder(X,Ds,Rs).

Ответы [ 3 ]

1 голос
/ 22 февраля 2020
before(X,Y, Ds) :-
   phrase(( ..., [X], ..., [Y], ... ), Ds).

... --> [] | [_], ... .
1 голос
/ 22 февраля 2020

Это правильная догадка: member/2 можно использовать для этого.

Возможно, вы думали написать что-то вроде этого:

before(A,Z,[A|Xs]) :-   member(Z,Xs).
before(A,Z,[_|Xs]) :- before(A,Z,Xs).

Пример запроса с использованием SICStus Prolog 4.5.1:

| ?- before(2,X,[1,2,3]).
X = 3 ? ;
no

А вот еще один запрос, этот даже немного более общий:

| ?- before(A,Z,[1,2,3,4]).
A = 1, Z = 2 ? ;
A = 1, Z = 3 ? ;
A = 1, Z = 4 ? ;
A = 2, Z = 3 ? ;
A = 2, Z = 4 ? ;
A = 3, Z = 4 ? ;
no
0 голосов
/ 21 февраля 2020

если вы не делаете это для обучения, вы можете использовать append / 2:

before(X,Y,Ds) :-
  append([_,[X],_,[Y],_],Ds).

?- before(2,X,[1,2,3]).
X = 3 ;
false.

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