2016-11-05 11 views
0

私はpredicate/2を、検証として「正しい」数字のリストと、検証する必要のある関数を取る必要があります。関数内の数字(number(X)と表されます)は、「真」になるためには、検証リスト内の数字と同じでなければなりません。Prolog。述語を結合する

ライブラリでリストが「ハードコード」されているときに正しい答えを与える2つの別々のものを作ることに問題はありませんが、私は神のためにこれらを組み合わせないことができます。

私はこれまでのところ、これを持っている:

number(X) :- member(X, [1,2,3,4,5]). 

私は例and(number(2),number(4))のためを求めるとき、それはそう言っていない、とand(number(2),number(6))は何を与えるように、これは正しい結果を与えます。

今、私はpredicate/2を実行しなければなりません。これは最初の引数としてリストを取ります。 誰でも助けたり、何かヒントを与えたりできますか?

predicate(ValidationList, Function) :- ???? 
+0

わからないかもしれないが... 'と( (2)、number(4)) 'と' and(number(2)、number(6)) '検証する関数の例ですか?あるいは、「検証する必要がある機能」とは何を意味していますか(いくつかの例を示すことができますか?)とにかく...あなたの「述語/ 1」を表示できますか? – max66

+0

はい、これは検証される関数の例です。命題の公式についてです。 "and(number(1)、number(2))"が正しければ、検証リストには数字1と2が含まれていなければなりません。 "number(X): - member(X、[1,2 、3,4,5])」が働いています。 私の問題は、述語を定義することです。たとえば、述語([1,3,5,7]、または(number(1)、number(2)))を後で入力することができます。 1と2がリストの一部であるかどうかをチェックします。 – DaoDib

答えて

0

あなたはcall述語を使用することができます。たとえば

and(X,Y) :- call(X), call(Y). 
or(X,Y) :- call(X); call(Y). 

predicate(List, Function) :- 
    Function =.. [P,X,Y], 
    call(P, member(X, List), member(Y, List)). 

?- predicate([1,2,3], and(1,3)). 
true. 

?- predicate([1,2,3], and(1,4)). 
false. 

?- predicate([1,2,3], or(1,4)). 
true. 

?- predicate([1,2,3], or(4,5)). 
false. 
+0

わかりません。 これは、数式が自分の検証リストのメンバーであるかどうかをどのようにチェックするのですか? – DaoDib

+0

私の答えをもう一度チェックしてください。 –

0

別の解決策は、unserstandする

predicate(ValList, and(X, Y)) :- 
    predicate(ValList, X), 
    predicate(ValList, Y). 

predicate(ValList, or(X, Y)) :- 
     predicate(ValList, X) 
    ; predicate(ValList, Y). 

predicate(ValList, number(X)) :- 
    member(X, ValList).