2017-05-27 27 views
0

我在做一個從this獲取的序言練習。未能在序言中設置輸入和輸出

我現在要做的是改變程序的輸入輸出方式。
我需要通過在控制檯鍵入該執行程序:

goldbach(100, L). 

只是舉例,我需要按[;]顯示當前一個被打印在屏幕上的下一個結果。

L = [3, 97]; 
L = [11, 89]; 
L = .... 

不過,我想說的是象下面這樣:

Input a number:100. 
L = [3, 97]. 
L = [11, 89]. 
..... 

這是程序將打印出「輸入一個數字:」第一,讀你的輸入,然後自動打印出所有可能的結果。

我看了一下讀段()和寫,但是當我添加這些我得到失敗:

read_gold :- 
    write('Input a number:'), 
    read(X), 
    write(goldbach(X, L)). 

如何解決我的代碼,以使程序實現我想要的輸入和輸出?謝謝回答。

+0

您想要修改或重新實現頂層。對於初學者來說,肯定太複雜了。 – false

+0

你不能'寫(goldbach(X,L))'來得到查詢'goldbach(X,L)'的結果。謂詞不返回解作爲函數返回值。 – lurker

回答

2

像這樣的東西可以從字面上做你要求的東西,雖然通常情況下你是如何使用Prolog查詢和解決方案的。

read_gold :- 
    write('Input a number:'), 
    read(X), 
    show_results(goldbach(X)). 

show_results(Query) :- 
    call(Query, L), 
    write('L = '), write(L), write('.'), nl, 
    fail. 
show_results(_). 

一個更清潔的方式來收集所有的解決方案在一個走的是使用findall/3一一列舉:

read_gold(Solutions) :- 
    write('Input a number:'), 
    read(X), 
    findall(L, goldbach(X, L), Solutions). 

,或在不明確提示:

read_gold(X, Solutions) :- 
    findall(L, goldbach(X, L), Solutions). 

和查詢它作爲,例如:

?- read_gold(100, Solutions). 
Solutions = [[3, 97], [11,89], ...] 
+0

使用'write/1'寫詞是相當有問題的。而是使用'writeq/1' – false

+0

感謝您的回答。現在我知道我應該閱讀關於查詢。解決大部分問題是一件好事和重要的事情。 – Limoncool