2015-11-28 86 views
1

我有代碼在PROLOG:遞歸創建列表

vals(_,[],_). 
vals([H|T],[(H,C)|L],K) :- vals([H|T],L,(K,C)). 

此代碼的接收機列表和元組的列表,例如:

vals([1],[(1,4),(1,2)],X). 

我檢查是否從第一列表元素等於一些元組來自另一個列表的第一個元素。在這種情況下,foundValues將返回true,因爲1等於每個元組的第一個元素。這工作正常,但不是返回true/false,在結果列表中,我想返回每個元組的第一個元素與列表中的元素相等的所有第二個元素。在這種情況下,X應該是[4,2]。我試圖用(K,C)做到這一點,但沒有成功。 所以,問題是 - 如何返回列表?

+0

一個萬一cut 2.

  • 考慮重寫這個現在,Y我們對'vals/3'的第三個參數並沒有真正做任何事情。你可以讓它成爲你想要的清單。如果'[H | T]'的頭部與[[H,C)| L]頭部的第一個元素匹配,那麼第三個參數的頭部應該是什麼?你認爲第三論點尾巴應該來自哪裏(或者應該如何確定)? – lurker

  • +0

    第三個參數的頭部應該是C,但我不知道如何在每次調用後遞歸添加元素到列表中。 – dreamPr

    +0

    結果會看起來像'[C | R]'。你只需告訴它如何從輸入的尾部得到結果的尾部('R')。這比你想象的容易。 – lurker

    回答

    1

    下面是一個關於如何附加到列表的例子,僅用於1個元素。

    三種情況:

    • 對於空單
    • 當元素的元組
    • 當元素不匹配

    這個,你應該開始的第一項匹配能夠創造你的榜樣。

    vals(_,[],[]). 
    vals(H,[(H,C)|L],[C|K]) :- vals(H,L,K). 
    vals(H,[(H2,_)|L],K) :- 
        H \= H2, 
        vals(H,L,K). 
    

    實施例:

    vals(1,[(1,2),(1,3)],X). 
    X = [2, 3] ; 
    false. 
    

    額外:

    +0

    如果第一個列表中的元素的個數至少與第二個元素的個數相同,那麼該謂詞總是返回'[]',如果第一個列表比第二個列表短,則該謂詞失敗。第二個和第三個子句中的第一個參數「H」不正確。另外,爲什麼會考慮使用累加器?最後,爲什麼建議在案例2中削減?它應該使用'dif(H,H2)'而不是剪切,它保持了謂詞的關係能力。 – lurker

    +0

    當沒有任何東西沒有匹配時,是不是隻返回一個空列表? –

    +0

    沒有。你試過了嗎?嘗試,例如'vals([1,2],[(1,a),(3,b),(4,c)],L).'。結果應該是'L = [a]'。 OP的例子恰好只使用一個元素的列表。但描述清楚地說,*檢查第一個列表中的元素是否等於一些元組* * – lurker