2016-06-17 3 views
0

Нам нужно написать пролог-пролог neighbors(X,Y,L), который является истинным, если L - это список, а X и Y являются соседними элементами в списке. До сих пор я писал:(Пролог) Поиск соседей в списке

neighbors(X,X,[X]). 
neighbors(X,Y,[X,Y|R]):- neighbors(X,Y,R). 
neighbors(X,Y,[Y,X|R]):- neighbors(X,Y,R).` 

но выход всегда будет давать (очевидно) пустые скобки («[]») независимо от входных данных. Можете ли вы, ребята, дать мне несколько советов о том, как улучшить этот предикат? Мы недавно начали с Пролога, поэтому мне по-прежнему нужна практика.

+0

Что идея 'соседей (X, X, [X])'.? Это кажется мне чем-то странным. Пожалуйста, объясни! – repeat

ответ

0

Итак, я все время пытался найти и найти ответ.

я должен был рассмотреть 2 случая:

  1. X и Y является соседом с X, Y так neighbors(X,Y,[X,Y|_]).

  2. X и Y является соседом с YX так neighbors(X,Y,[Y,X|_]).

А также мы должны проверить весь список, пропустив каждый элемент, который не имеет отношения к нам (все элементы, которые не соответствуют X или Y). Это может быть сделано с помощью рекурсии neighbors(X,Y,[F,S|R]) :- neighbors(X,Y,[S|R]).

поэтому весь предикат должен быть

neighbors(X,Y,[X,Y|_]). 
neighbors(X,Y,[Y,X|_]). 
neighbors(X,Y,[F,S|R]) :- neighbors(X,Y,[S|R]). 

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

+0

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

2

Вы должны использовать Append:

neighbors(X,X,[X]). 

neighbors(X,Y,L) :- 
     append(_, [X,Y|_], L) 
    ; append(_, [Y,X|_], L). 
+1

У меня есть небольшое предложение по удобочитаемости: все, кто читает это, скорее всего, неправильно понимают ';' как ',', потому что символы выглядят так похожие и ',' обычно появляются в конце строки. Поэтому мое предложение состоит в том, чтобы всегда поставить ';' ** перед ** (следующей) строкой в ​​таких случаях. – mat

+1

Я думаю, что вы правы, сделали! – joel76

+1

Ницца! Это хорошее решение, +1. Макет, который я бы рекомендовал для этого, - использовать круглые скобки и отступ также для первой строки: ';' является основным функтором, и обе цели являются аргументами. – mat

Смежные вопросы