Моя цель - создать предикат, который проверяет, содержит ли данный список элементы, занимающие определенные позиции в каком-либо другом списке.Предикат ECLiPSe для проверки того, содержит ли список элементы с определенными позициями в другом списке
Точнее, я ищу предикат, который будет истинным тогда и только тогда список L
был элементы внутри него, обозначающие строки в массиве NxN
A
, представленном уплощенного список C
. Например, если A = [[0,1],[1,1]], C = [0,1,1,1], L = [1,1], N=2
, то predicate(L,C,2)
должно быть истинным.
Моя попытка выглядит следующим образом (предполагается, что L имеет по крайней мере 2 элемента):
row([H1,H2|T],C,N) :- M is N*N-N+1, X::1..M, X #= N*_ + 1,
nth1(X,C,H1), Y is X+1, nth1(Y,C,H2),
nextr([H2,T],C,Y).
nextr([H1,H2|T],C,Y) :- nth1(Y,C,H1), Z is Y+1, nth1(Z,C,H2),
nextr([H2,T],C,Z).
nextr([H1,H2],C,Y) :- nth1(Y,C,H1), Z is Y+1, nth1(Z,C,H2).
row
предикат убеждается, что первый элемент L
занимает положение в C
, что обозначает начало населенного пункта новая строка в массиве A
и, кроме того, проверяет, что следующий элемент L также является следующим элементом в C
. Затем следующий предикат проверяет только последнее условие.
На мой взгляд, это должно работать нормально. К сожалению - это не делает, а row([0,1],[0,1,1,1],2).
выходов No
:(
EDIT: Хорошо, это был глупый пример, который я заметил, но в любом случае - это не работает на row([1,2,3],[1,2,3,4,5,6,7,8,9],1).
BT выводит Yes
на row([1,2|3],[1,2,3,4,5,6,7,8,9],1).
у меня нет. получить его.
Я довольно новыми для Пролога так простите меня, если то, что я прошу, это очень очевидно, но я думал об этом в течение последних нескольких часов, и не мог понять, что происходит.
Да, у вас это есть. '[H | Hs]' * очень * отличается от '[H, Hs]'. Путаница этих двух ошибок является общей новичком. Для очень простого примера рассмотрите разницу между «[H | []]» и «[H, []]». Сколько элементов в каждом из этих списков? В каком количестве эквивалентных * других * способов вы можете написать каждый из них? – mat