Получите повторные ответы при сравнении фактов в прологе - PullRequest
0 голосов
/ 13 января 2011

Работа с SWI-Прологом.У меня в списке рангов сказано:

rank(London, 3.5).
rank(New York, 3.5).
rank(Seattle, 2.3).

И я пытаюсь выработать правило, которое печатает / возвращает любые факты с таким же рангом.Так что в этом случае он вернется с Лондона и Нью-Йорка.

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

equal_rank(_):-
    rank(U1, R1),
    rank(U2, R2),
    U1 \== U2,
    R1 == R2,
    print(R1), print(': '), print(U1), print(', '), print(U2), nl,
    fail.

Вывод будет:

3.5: London, New York
3.5: New York, London

Я просто не могу понять, как остановить эту вторую строку.

Ответы [ 2 ]

1 голос
/ 14 января 2011

Я бы, вероятно, выбрал что-то, что использует bagof/3, но я не знаю, является ли это предпочтительным или более подходящим подходом к проблеме, которая у вас есть.С учетом фактов, которые вы определили, следующая цель, по-видимому, дает желаемый результат:

| ?- bagof(C, rank(C, X), Cs), length(Cs, L), L > 1.

Cs = [london,'new york']
L = 2
X = 3.5

yes

Разумеется, требуется некоторая работа по форматированию;Идея сбора результатов в списке может или не может быть полезной для вас.Да, и, кстати, я не был уверен, что названия городов должны быть переменными, поэтому, как вы можете видеть, я утверждал rank/2 фактов, используя простые атомы.*, вы можете обратиться к онлайн справочной странице SWI-Prolog об этом.

1 голос
/ 14 января 2011

Простой подход состоит в том, чтобы заменить неравный тест между U1 и U2 тестом с меньшим значением:

U1 @< U2. 

Таким образом, данная пара появляется только один раз.

...