Как изобразить «где-то слева» в прологе? - PullRequest
0 голосов
/ 04 ноября 2011

В Прологе, как изобразить ситуацию "где-то слева". Например, есть список «Список» и два термина «X» и «Y», как представлять правило: X находится где-то слева от Y в списке.

Ответы [ 4 ]

2 голосов
/ 08 ноября 2011

Вы хотите описать некоторые свойства списков.Грамматика часто является лучшим способом решения этой проблемы.

... --> [].
... --> [_], ... .

?- Xs = "abc", phrase((...,[X], ..., [Y], ...), Xs).
Xs = "abc",
X = a,
Y = b ;
Xs = "abc",
X = a,
Y = c ;
Xs = "abc",
X = b,
Y = c ;
false.
2 голосов
/ 04 ноября 2011

Это можно свести к проблеме согласования подпоследовательностей.

subsequence([], _).
subsequence([X|Sub], [X|Seq]) :-
    subsequence(Sub, Seq).
subsequence(Sub, [_|Seq]) :-
    subsequence(Sub, Seq).

Тогда ваш «оставленный» запрос будет subsequence([X, Y], List), !.

1 голос
/ 05 ноября 2011

это можно сделать разными способами.
nth1 (N, List, X) - это предикат, который имеет значение true, если N-й элемент списка равен X.

Реализация, использующая nth1, довольно хороша.легко;попытайтесь решить его до того, как увидите мой код.

left(X,Y,L):-
    nth1(NX,L,X),
    nth1(NY,L,Y),
    NX<NY.

Другие способы решить это с помощью добавления / 3:

left(X,Y,L):-
   append(_,[X|T],L),
   member(Y,L).

или простой рекурсии:

left(X,Y,[X|T]):-
   member(Y,T).
left(X,Y,[H|T]):-
   H=\=X,
   left(X,Y,T).
0 голосов
/ 04 ноября 2011

Если у вас уже есть предикат append / 3, вы можете использовать:

left(A,B,S) :-
    append(_,[B,A|_],S).

Если вы спросите:

?- left(1,2,[1,2,3,4]).
false.

?- left(2,1,[1,2,3,4]).
true

-Leo

...