2016-02-20 54 views
1

是否有序言的方式做出如下縮短:序言:效率

rule(prop, [1/2,2/2]). 
rule(prop, [1/3,2/3,3/3]). 
rule(prop, [1/4,2/4,3/4,4/4]). 
rule(prop, [1/5,2/5,3/5,4/5,5/5]). 
rule(prop, [1/6,2/6,3/6,4/6,5/6,6/6]). 
rule(prop, [1/7,2/7,3/7,4/7,5/7,6/7,7/7]). 

回答

3

下面的代碼不一定對6條不同規則的情況下,「短」,但它是更具可擴展性,這可能是你真正的意思。

你可以按如下方式解決這個問題。首先,規則生成一個列表:

list_props(N, N, [N/N]). 
list_props(X, N, [X/N|T]) :- 
    X >= 1, 
    X < N, 
    X1 is X + 1, 
    list_props(X1, N, T). 

當你調用這一點,從第一個參數到最後最後一個參數是分母產生比例的一個列表。例如:

| ?- list_props(1, 4, L). 

L = [1/4,2/4,3/4,4/4] ? a 

| ?- 

需要注意的是,你可以強制執行N是使用integer(N)和條件的整數> = 1,但我是短暫的,並沒有這樣做,在上面。

您可以在頂級謂語使用:

rule(prop, L) :- 
    between(2, 7, X), 
    list_props(1, X, L). 

其中產量:

| ?- rule(prop, L). 

L = [1/2,2/2] ? ; 

L = [1/3,2/3,3/3] ? ; 

L = [1/4,2/4,3/4,4/4] ? ; 

L = [1/5,2/5,3/5,4/5,5/5] ? ; 

L = [1/6,2/6,3/6,4/6,5/6,6/6] ? ; 

L = [1/7,2/7,3/7,4/7,5/7,6/7,7/7] ? ; 

(2 ms) no 
| ?- 
+1

是的,這很好。並感謝您的解釋! – Brutalized

4

TL; DR:爲什麼不委託處理遞歸—並獲得正確的責任呢?

這個答案跟在this previous answer @lurker。我們沒有覆蓋整個的問題,而是集中展示怎麼樣list_props/3謂語可以這樣定義:所有遞歸交給了嘗試和真正的Prolog謂詞 length/2numlist/2maplist/3

 
:- use_module (library (between), [numlist/2]). 
:- use_module(library(lists), [maplist/3]). 

要定製多功能maplist/3我們定義:使用 4.3.2

 
denom_num _expr(B, A, A/B). 

樣品查詢:

 
| ?- length (_Ds, N), numlist (N, _Ds), maplist (denom_num_expr(N), _Ds, Qs). 
N = 1, Qs = [1/1] ? ; 
N = 2, Qs = [1/2,2/2] ? ; 
N = 3, Qs = [1/3,2/3,3/3] ? ; 
N = 4, Qs = [1/4,2/4,3/4,4/4] ? ; 
N = 5, Qs = [1/5,2/5,3/5,4/5,5/5] ? ; 
N = 6, Qs = [1/6,2/6,3/6,4/6,5/6,6/6] ? ; 
N = 7, Qs = [1/7,2/7,3/7,4/7,5/7,6/7,7/7] ? ; 
N = 8, Qs = [1/8,2/8,3/8,4/8,5/8,6/8,7/8,8/8] ? ; 
N = 9, Qs = [1/9,2/9,3/9,4/9,5/9,6/9,7/9,8/9,9/9] ? ... 
+1

是的,獲得'list_prop/3'(+1)更優雅的方法。除了習慣之外,沒有特別的理由,我傾向於使用gprolog來處理沒有'numlist/3'的小Prolog任務,但是'numlist/3'很容易創建。 – lurker

+1

我們需要更多共同點!雖然SWI和SICStus都提供了numlist/3,但它們提供了不同的模式,IIRC。 (通過SICStus,我們可以踢出多餘的'長度/ 2'的進球。) – repeat

+1

@lurker。我收回了之前關於「SICStus爲'numlist'提供更多(可用)模式的聲明」;那是一廂情願的想法。 – repeat