我有一個規劃問題 (https://blog.svpino.com/2015/05/08/solution-to-problem-5-and-some-other-thoughts-about-this-type-of-questions):如何在Prolog中解決這個算術表達式難題?
編寫一個程序,輸出所有可能放+或 - 或 之間沒有任何的數字1,2,...,9(按照這個順序)這樣的結果是 總是100.例如:1 + 2 + 34 - 5 + 67 - 8 + 9 = 100。
我解決了這個問題與Python得到11答案:
import itertools
for operator in [p for p in itertools.product(['+','-',''], repeat=8)]:
values = zip([str(x) for x in range(1, length+1)], operator) + ['9']
code = ''.join(itertools.chain(*values))
if 100 == eval(code):
print "%s = %d" % (code, eval(code))
這是我的第二個Python代碼,它是長度(https://gist.github.com/prosseek/41201d6508f01cf1643e):
[1, 2, 34, -5, 67, -8, 9]
[1, 23, -4, 56, 7, 8, 9]
[12, 3, -4, 5, 67, 8, 9]
[123, -4, -5, -6, -7, 8, -9]
[1, 23, -4, 5, 6, 78, -9]
[12, 3, 4, 5, -6, -7, 89]
[12, -3, -4, 5, -6, 7, 89]
[123, -45, -67, 89]
[123, 45, -67, 8, -9]
[1, 2, 3, -4, 5, 6, 78, 9]
[123, 4, -5, 67, -89]
我還發現了一個建議的解決方案在序言 (http://www.reddit.com/r/programming/comments/358tnp/five_programming_problems_every_software_engineer/cr2dvsz):
sum([Head|Tail],Signs,Result) :-
sum(Head,Tail,Signs,Result).
sum(X,[],[],X).
sum(First,[Second|Tail],['+'|Signs],Result) :-
Head is First + Second,
sum(Head,Tail,Signs,Result).
sum(First,[Second|Tail],['-'|Signs],Result) :-
Head is First - Second,
sum(Head,Tail,Signs,Result).
sum(First,[Second|[Third|Tail]],['+'|[''|Signs]],Result) :-
C is Second*10+Third,
Head is First + C,
sum(Head,Tail,Signs,Result).
sum(First,[Second|[Third|Tail]],['-'|[''|Signs]],Result) :-
C is Second*10+Third,
Head is First - C,
sum(Head,Tail,Signs,Result).
然而,這僅給出4解決方案(不是如預期的那樣):
?- sum([1,2,3,4,5,6,7,8,9],X,100).
X = [+, +, -,+, +, +,'',+] ;
X = [+, +,'',-, + '', -,+] ;
X = [+,'', -,+, +, +,'',-] ;
X = [+,'', -,+ '', +, +,+] ;
false.
這是因爲''
未顯示爲第一個列表項目。因此跳過解決方案[12,...]
和[123,...]
。
我嘗試添加sum(First,[Second|Tail],[''|Signs],Result) :- Head is First*10 + Second, sum(Head,Tail,Signs,Result).
, 但這樣做將返回15解決方案,而不是11
的解釋是,與錯誤的解釋1+23
到((1)+2)*10+3
。
?- sum([1,2,3], [+,''], Result).
Result = 33.
那麼,如何在Prolog中解決這個問題呢?在這個例子中如何教Prolog 1 + 23
是24
?
使用' : - set_prolog_flag(double_quotes,chars).'使答案更具可讀性。 – false
@false。謝謝!現在好多了。 – repeat