2017-09-17 12 views
1

対応するリストから値を比較して取得しようとしています。リストと要素の比較

V1が最初のリスト Xsでチェックされ、そして Ysで対応する値を返すために V2に与えられている
?- correspond_elements(a, [a,b,b,a], X, [1,2,3,4]). 
X = 1; 
X = 4. 

:私の述語は、私は次のような動作を期待correspond_elements(V1, Xs, V2, Ys)、です。私は->句が真なると、その後、;後に何が実行されていないことを知っている

?- correspond_elements(a, [a,b,b,a], X, [1,2,3,4]). 
X = 1. 

:最初の値のみを取得し

% checks if the argument is a list 
is_list([]). 
is_list([_|T]) :- 
    is_list(T). 

% predicate 
correspond_elements(V1, [X|Xs], V2, [Y|Ys]) :- 
    is_list([X|Xs]), 
    is_list([Y|Ys]), 
    (V1 == X -> 
     V2 is Y 
    ; 
     correspond_elements(V1, Xs, V2, Ys) 
    ). 

:これまでのところ私はこれを持っています。私のコードはXの最初の答えを取得して停止することは明らかですが、最初の答えが見つかった後でも、リストを再帰させ、Xのすべての可能な回答を返す方法は不明です。あなたが自分自身を発見してきたように

答えて

1

、プロローグA -> B; Cのされたif-then-else条件Aをチェックし、trueあれば、それはB(とないC)を実行します。それ以外の場合はCBではなく)が実行されます。

Atrueの場合は、追加オプションとしてCを実行します。 Bためのガードとして今A働くので

foo(Some,Parameters) :- 
    A, 
    B. 
foo(Some,Parameters) :- 
    C. 

、関係なくAが成功したか失敗したか、Prologはバックトラックと第二foo/2を実行する:

foo(Some,Parameters) :- 
    A 
    -> B 
    ; C. 

に:これは、形質転換することにより、行うことができます句。

我々は(私の意見では少し冗長です)is_list(..)述語を削除した場合、我々は述語を生成することができます:

correspond_elements(X, [X|_], Y, [Y|_]). 
correspond_elements(V1, [_|Xs], V2, [_|Ys]) :- 
    correspond_elements(V1, Xs, V2, Ys). 

私たちは、私たちが統一を使用するので、ここでの条件V1 == Xを記述する必要はありませんこれの頭。統一を使用するので、V1 = X(1つの方程式記号)です。つまり、より多方向の方法で述語を使用できます。

?- correspond_elements(A, [a,b,b,a], X, [1,2,3,4]). 
A = a, 
X = 1 ; 
A = b, 
X = 2 ; 
A = b, 
X = 3 ; 
A = a, 
X = 4 ; 
false. 

は内の要素を取得します。すべてのタプルAと両方のリストのX( "ジッパー" のいくつかの並べ替え)を照会

?- correspond_elements(a, [a,b,b,a], X, [1,2,3,4]). 
X = 1 ; 
X = 4 ; 
false. 

第二のリストXの要素の照会最初のリスト:

?- correspond_elements(A, [a,b,b,a], 1, [1,2,3,4]). 
A = a ; 
false. 

Gen 1がリストにあるようなリストを削除してください:

?- correspond_elements(A, [a,b,b,a], 1, L). 
A = a, 
L = [1|_G1285] ; 
A = b, 
L = [_G1284, 1|_G1288] ; 
A = b, 
L = [_G1284, _G1287, 1|_G1291] ; 
A = a, 
L = [_G1284, _G1287, _G1290, 1|_G1294] . 
+0

ありがとう、私はちょうどプロローグの考え方に問題があると思います。これは、多くのおかげで、クリア:)。 – RoadRunner

関連する問題