2016-12-13 3 views
0

Моя цель - создать предикат, который проверяет, содержит ли данный список элементы, занимающие определенные позиции в каком-либо другом списке.Предикат ECLiPSe для проверки того, содержит ли список элементы с определенными позициями в другом списке

Точнее, я ищу предикат, который будет истинным тогда и только тогда список L был элементы внутри него, обозначающие строки в массиве NxNA, представленном уплощенного список 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). у меня нет. получить его.

Я довольно новыми для Пролога так простите меня, если то, что я прошу, это очень очевидно, но я думал об этом в течение последних нескольких часов, и не мог понять, что происходит.

ответ

1

Хорошо, я думаю, что получил. Когда я пишу [H|T], тогда H является элементом, а T - это список. Поэтому вызов предиката на [H,T] не эквивалентен вызову предиката на L, который создается append(H,T,L).

+0

Да, у вас это есть. '[H | Hs]' * очень * отличается от '[H, Hs]'. Путаница этих двух ошибок является общей новичком. Для очень простого примера рассмотрите разницу между «[H | []]» и «[H, []]». Сколько элементов в каждом из этих списков? В каком количестве эквивалентных * других * способов вы можете написать каждый из них? – mat