2015-10-29 2 views
0

Я работаю над программой расписания. С учетом [t,t,t,f,t] и [f,f,t,f,f]. Я хочу иметь функцию последующейКак реализовать AND оператор списка в прологе?

and(L,[t,t,t,f,t],[f,f,t,f,f]). 
L = [f,f,t,f,f]. 

Я знаю, как реализовать и оператор 2 элемента. Но я не знаю, как реализовать версию списка.

Это то, что я уже сделал:

available(Z,X,Y):- Z = t, X = t, Y = t. 
available(Z,X,Y):- Z = f, X = f. 
available(Z,X,Y):- Z = f, Y = f. 

ответ

3

Я бы сначала определить двоичную и band/3 следующим образом:

band(t,t,t). 
band(t,f,f). 
band(f,t,f). 
band(f,f,f). 

, а затем использовать maplist/3 собрать все ответы:

and(L, Left, Right):- 
    maplist(band, Left, Right, L). 

Пример запроса:

?- and(L,[t,f,t,f],[t,t,f,f]). 
L = [t, f, f, f] 
1

Во-первых, давайте исправим and/3, чтобы охватить все возможности. Обратите внимание, что вы можете объединить с атомами в заголовке правила, поэтому вместо

xyz(X) := X=a; 

вы можете написать

xyz(a). 

и пропустить тело. Вот and/3:

and(t, t, t). 
and(t, f, f). 
and(f, t, f). 
and(f, f, f). 

Вы можете сжать это два правила, но это не важно сделать работу списка.

Существует несколько способов сделать and_list/3 со встроенными предикатами списка, например maplist/4. Тем не менее, следует изучить основной рекурсивный способ написания этого, потому что это помогает в понимании остального Пролога:

and_list([], [], []). 
and_list([H1|T1], [H2|T2], [R|RT]) :- 
    and(H1, H2, R), 
    and_list(T1, T2, RT). 

Первый пунктом является базовым положением. Он сообщает Prolog, что делать, когда список пуст. Второе предложение объединяет рекурсивный вызов and_list/3 с вызовом and/3 на две главы списка.

Demo.

+0

Это то, что я есть, используя свой метод - and_list ([т, т, е, т] , [F, F, T, T], L). L = [f | _G883] –

+0

Спасибо за ответ. Вы дали мне идею –

+0

Вы вводите неверную переменную. LOL.So небрежно. Это должно быть RT вместо TR –

0

Вы должны следовать указаниям, полученным от других ответов. Но только чтобы показать, как ваш текущий код работает, рассмотрим

and(F,X,Y) :- maplist(available, F,X,Y), !. 

, что дает

?- and(L,[t,t,t,f,t],[f,f,t,f,f]). 
L = [f, f, t, f, f]. 
Смежные вопросы