Пролог проблема с findall, как построить решение списка, который является парой (element, list_of_elements) - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь решить проблему, но я не знаю, как правильно управлять поиском предикатов.

Идея следующая.

У нас есть таблица и некоторыеблоки, расположенные в стеке на столе.

Это может быть примером данной ситуации: Таблица-> a, b, c, d

Таким образом, блок a точно находится натаблица, блок b на блоке a и т. д.

У нас также есть некоторые предикаты, подобные следующему:

stacking(X,Y):-
    over(X,Y).

stacking(X,Y):-
    over(X,Z),
    stacking(Z,Y).

just_over_table(X).

Таким образом, предикат stacking(X,Y) указывает, что блок«Х» накладывается на блок Y, не обязательно точно на него, но Х находится на «высшем уровне».Например, в таблице стека-> abcd d укладывается поверх b.

Другим предикатом является over(X,Y), который указывает, что блок X находится точно над блоком Y, например, таблица->abcd, блок c закончен блоком b.

Проблема в том, чтобы написать новый предикат, называемый solution(L), L - список, содержащий все списки пар [B, LB], где B - блокстека с минимум двумя блоками под ним, исключая блок точно над таблицей (в примере таблица -> abcd, a точно над таблицей, b, c, d - нет).LB - это список, содержащий блоки, находящиеся в стеке под буквой B.Если нет ни одного блока, удовлетворяющего условиям, следует вернуть L. пустым.

Для решения этой проблемы мы можем использовать это знание в качестве примера:

over(d,c).
over(c,b).
over(b,a).

just_over_table(a).

Моя идея решитьпроблема заключается в следующем коде:

solution(L):-
    findall([B,LB],(stacking(B,X),stacking(X,Y),X\==Y, \+ just_over_table(Y)),L).

Проблема, которую я обнаружил, это то, что я не знаю, как вставить X и Y в список LB.

Для примераtable-> abcd

Решение должно быть L=[[d,[c,b]]]

1 Ответ

1 голос
/ 04 июня 2019

Если ваш код работает должным образом, решение простое: вместо

solution(L):-
    findall([B,LB],(stacking(B,X),stacking(X,Y),X\==Y, \+ just_over_table(Y)),L).

просто напишите

solution(L):-
    findall([B,[X,Y]],(stacking(B,X),stacking(X,Y),X\==Y, \+ just_over_table(Y)),L).

Так что просто замените LB на [X,Y].

?- solution(L).
L = [[d, [c, b]]]
...