Я пытаюсь решить проблему, но я не знаю, как правильно управлять поиском предикатов.
Идея следующая.
У нас есть таблица и некоторыеблоки, расположенные в стеке на столе.
Это может быть примером данной ситуации: Таблица-> 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]]]