2013-04-23 92 views
0

我需要一些关于三个序言谓词的帮助来检查和操作列表。我是新的prolog和任何帮助将不胜感激。序言列表谓词

三个谓词是:

  • double_up(+List1, -List2)为真时List2具有List1每个元素两次。查询double_up([a,b,c],X)应该给X=[a,a,b,b,c,c]。输出列表中元素的顺序无关紧要。
  • pivot(+List1, +Pivot, -Smaller, -GreaterEq)是真实的,当Smaller是一个数字比PivotList1小名单,并GreaterEq是数字的List1大于或等于Pivot列表。
  • fancy_replace(+List, +Takeout,+Putin, -NewList, -Count)为真时NewList是相同的列表作为输入List,但是其中列表中的每个元素Takeout置换为Putin元件。计数应该是被取代的外卖数量。例如,查询fancy_replace([9,10,1,9,2],9,0, X, C)应该给X = [0,10,1,0,2]C = 2。输出列表中元素的顺序无关紧要。
+2

等等。普京?什么? – 2013-04-23 07:01:26

+1

我有同样的反应:)希望克格勃不会对此发出警报...... – CapelliC 2013-04-23 07:21:10

回答

-1

说实话,我讨厌序言......即使它很有趣,易于你学会后

我想这是因为我无法理解序言中是如何工作的几个星期前,一个很好的参考。 what does the follow prolog codes do?

无论如何..这是你的第一个问题的答案;希望你能解决剩下的自己:d

double([]). 
double([H|[]], [H,H|[]]). 
double([H|T],[H,H|T1]):- double(T, T1). 

顺便说一句,这可能不是唯一的解决办法...但它的工作原理

+0

我无法想象你可以对一个丑陋复杂语言的开发者做些什么(如...选择一个:) – CapelliC 2013-04-23 06:10:27

+1

第二个条款是包含在第三条款中,您可以将其删除。此外,您可以将'[H | []]'简写为'[H]',将[H,H | []]'写为'[H,H]'。 – mat 2013-04-23 07:17:40

1

的简单模式处理列表中的Prolog规定与2递归谓词参数,匹配 - 传统 - 输入和输出数据,以及基本情况,停止递归,匹配空列表。然后

double_up([X|Xs], [X,X|Ys]) :- double_up(Xs, Ys). 
double_up([], []). 

该断言它比真实需要什么更多一般一点,因为它的工作原理也是模式double_up(-List1, +List2)。例如

?- double_up(L,[1,1,2,2]). 
L = [1, 2]. 

要限制所要求的模式,我认为这是必要白白代码复杂,动中有服务谓词清洁循环,并留下double_up只是为了测试的参数:

double_up(I, O) :- is_list(I), var(O), double_up_(I, O). 
double_up_([X|Xs], [X,X|Ys]) :- double_up_(Xs, Ys). 
double_up_([], []). 

枢轴/ 4可以是 '单行' 在SWI-Prolog的:

pivot(List1, Pivot, Smaller, GreaterEq) :- 
    partition(>(Pivot), List1, Smaller, GreaterEq). 

状分,与foldl从库(apply)这是一个容易实现最后需要的谓词:

fancy_replace(List, Takeout, Putin, NewList, Count) :- 
    foldl(swap_n_count(Takeout, Putin), List, NewList, 0, Count). 
swap_n_count(Takeout, Putin, L, N, C0, C) :- 
    ( L == Takeout 
    -> N = Putin, C is C0 + 1 
    ; N = L, C = C0 
    ).