Поиск структур Пролога - PullRequest
       8

Поиск структур Пролога

1 голос
/ 09 ноября 2010

Меня интересуют формулы, составленные из множества союзов (часть большой проблемы). Я хочу написать программу, которая принимает что-то вроде этого:

:- get_params(conj(conj(a,b),c),X)

и возвращает список всех параметров соединений, т.е. X=[a,b,c]. На данный момент я могу сделать

:- get_params(conj(a,b),X), чтобы получить X=[a,b]

с использованием простого сопоставления с образцом Пролога, но как бы вы поступили, например

:- get_params(conj(conj(a,b),c),X), чтобы получить X=[a,b,c]

Это кажется действительно простым, но я боролся весь день!

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

Поскольку вы описываете список, рассмотрите возможность использования записи DCG:

params(conj(A,B)) --> !, params(A), params(B).
params(X)         --> [X].

Пример:

?- phrase(params(conj(conj(a,b),c)), Ps).
Ps = [a, b, c].
2 голосов
/ 09 ноября 2010

Предполагая, что все конъюнкторы бинарные:

get_params(X, Y, L) :- 
  get_params(X, L1),
  get_params(Y, L2),
  append(L1, L2, L).
get_params(conj(X, Y), L) :-
  get_params(X, Y, L), !.
get_params(A, [A]).
...