2016-11-20 2 views
0

Я пытаюсь написать код Пролога, но я не могу заставить это возвращать true. Я пытаюсь найти список, который все элементы включены в два других списка. Например, все элементы списка A находятся в списках B и C, а не вместе. Мой Prolog код:Почему эта строка в прологе возвращает false?

member(X, [X|_]). 
member(X, [_|T]) :- 
    member(X, T). 

first([H0|T0], [H0|T1], A) :- 
    member(H0, A), 
    first(T0, [H0|T1], A). 
first([H0|T0], [_|T1], A) :- 
    first([H0|T0], T1, A). 

где член предикат возвращает истину, если элемент находится в списке. С предикатом «первым» я пытаюсь использовать предикат-член, чтобы найти соответствующий элемент из A и B в списке C. Если я найду, то перейдите далее в первый список и сравните его первый элемент со вторыми элементами списка и снова, если я буду соответствовать, я проверю, могу ли я найти его в третьем списке. Надеюсь, он это сделает, но когда я запустил

?- first([4, 6, 4], [4, 5, 6, 4], [1, 2, 4, 6]). 

он дает ложные данные, и я не могу понять, почему. Это кажется простой ошибкой внимания где-то, но я просто не могу обойти его.

+0

Вы, кажется, не хватает базового варианта для пустых списков. –

ответ

1

Я ничего не знаю про пролог, но, как и все, меня уже укусили логические ошибки. (=

Как я заметил, вы, кажется, не хватает базового варианта для first([], _, _) Пример:.

first([4], [4], [4]) :- 
    member(4, [4]), // quite true 
    first([], [4], [4]). // No matching rule, as all those assume an existing head in the first argument 
+0

Да, это была моя ошибка, спасибо !. РЕШИТЬ – Oskars

0

Я не уверен, что я понял ваш вопрос, но позволит мне, чтобы попытаться указать далее свой предикат первый/3:

first(+L, +L1, +L2) 
    succeeds if every element of L is found either in L1 or in L2. 

Если это то, что вы ищете, то:

first([], _, _). 
first([E|L], L1, L2) :- 
    (member(E, L1); member(E, L2)), 
    first(L, L1, L2). 

Примеры успеха:

first([1, 2, 3], [1, 2, 3], [1, 2]). 
first([1], [1, 2, 3], [1, 2]). 
first([1, 2, 3], [1, 2, 3], []). 

Примеры faiure:

first([1, 2, 3, 5], [1, 2, 3], [1, 2]). 
first([7], [1, 2, 3], [1, 2]). 
first([1, 2, 3], [], []). 
Смежные вопросы