Пролог Список пар - PullRequest
       3

Пролог Список пар

1 голос
/ 23 июля 2011

У меня есть ввод списка пар:

[[abs_(p,X,Y,Z),abs_(f,X,Y,Z)],[abs_(p,X,Y,Z),abs_(l,Z,P)]]

Я хочу проверить, имеет ли пара одинаковое количество аргументов, в этом случае да:

[abs_(p,X,Y,Z),abs_(f,X,Y,Z)]

Вво втором случае ответ - нет.

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

[[abs_(p,X,Y,Z),abs_(f,X,Y,Z)]

Что мне делать?

Ответы [ 3 ]

1 голос
/ 23 июля 2011
run( [], Tail) :- Tail=[].
run( [ [First,Second] | Tail ], Output ) :- First =.. List1, Second =.. List2, 
length(List1,N1), length(List2, N2), N2 is N1, !, run(Tail, Tail2), 
append( [ [First | [Second]] ], Tail2, Output ). 
run( [H|T], Output ) :- run(T, Output).

Первое правило - базовый вариант.Второе правило проверяет количество аргументов в первой паре, если оно запускает рекурсивный вызов и добавляет вывод из рекурсивного вызова с помощью этой пары в Output.Из-за сокращения, если N2 равно N1, это не вызывает третьего правила.И третье правило - отбросить непревзойденную пару и вызвать себя с хвостом списка.Надеюсь, это поможет.

1 голос
/ 23 июля 2011

Prolog предоставляет странный инфиксный оператор = .. , называемый "univ", который преобразует между составными терминами и списком, который начинается с функтора, за которым следуют аргументы этого функтора.

Следовательно, запрос Пролога выглядит примерно так:

?- abs_(p,X,Y,Z) =.. L.
L = [abs_,p,X,Y,Z]
yes

Поэтому я бы использовал length / 2 в списках, созданных оператором "univ", чтобы проверить, что два составных термина имеют одинаковое количество аргументов.

0 голосов
/ 23 июля 2011

Вы также можете использовать сопоставление с образцом, чтобы разбить каждую пару на термины, и использовать предикат функтора, чтобы проверить арность этих терминов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...