2012-04-26 10 views
0

Я хочу определить предикатную силовую схему (X, P), которая истинна, когда P - это набор силовых элементов X. Должен работать независимо от того, заземлен или нет P.Предикат предиката Prolog

+0

, что вы уже пробовали? На каком прологе вы работаете? Это домашнее задание? –

+0

STICStus. Это вопрос практики, с которым я не могу решить решение. – user1283759

+0

Какой код у вас есть? –

ответ

4

Поскольку вы используете SICStus Prolog, вы можете использовать subseq0 (+ Sequence,? SubSequence) из библиотеки (списков), которая «истинна, когда SubSequence является подпоследовательностью последовательности, но может быть самой последовательностью» (цитата из руководства http://www.sics.se/sicstus/docs/4.0.2/html/sicstus/lib_002dlists.html).

 ?- setof(X, subseq0([a,b,c],X), Xs). 
     Xs = [[],[a],[a,b],[a,b,c],[a,c],[b],[b,c],[c]] 

Если вы не можете использовать библиотечные предикаты можно реализовать subseteq0, как описано в gnu Prolog powerset modification, который я привожу здесь для полноты картины (с благодаря gusbro)

powerset([], []). 
powerset([H|T], P) :- powerset(T,P). 
powerset([H|T], [H|P]) :- powerset(T,P). 
+1

Я только что отметил [эту странную терминологическую проблему] (http://en.wikipedia.org/wiki /Subsequence#Substring_vs._subsequence): последовательность и строка часто используются синонимом, но подпоследовательность и подстрока не идентичны ... – false

+1

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