将1和0转换为Prolog中的字符列表

时间:2017-11-08 02:00:40

标签: prolog

我有一个使用prolog的家庭作业,我正在将一组1和0翻译成一组不同的字符。例如,这是我的事实

analog([1], .). 
analog([1, 1, 1], -).
analog([0], "").
analog([0, 0, 0], ^).
analog([0, 0, 0, 0, 0, 0, 0], #).

示例输入将是

之类的列表
  [1,1,1,0,1,1,1,
  0,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1,
  0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,
  1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1,
  0,1,1,1]

我有以下代码:

signal_morse([], []). %base case 
signal_morse([A, B, C | Rest, R) :- 
  analog([A, B, C], H), 
  signal_morse(Rest, T), 
  append([H], T, R).

它目前只检查列表中的前三个元素,如果前三个元素与任何事实不匹配,我希望能够检查1个元素。

例如,假设我有[1,0,0],因为这与我的任何规则都不匹配,我希望程序检查[1]并继续查看列表的其余部分。

所以我想知道是否存在任何类型的模式匹配我可以这样做,如果代码analog([A, B, C], H)找不到匹配项,那么代码将尝试匹配第一个字符,如{{1} }。

1 个答案:

答案 0 :(得分:3)

我意识到这对你的家庭作业可能没什么帮助,但这对DCG来说是一个非常完美的问题,我可以帮助你,但它会告诉你它会是什么样子。

analog(.) --> [1].
analog(-) --> [1,1,1].
analog("") --> [0].
analog(^) --> [0,0,0].
analog(#) --> [0,0,0,0,0,0,0].

analogs([]) --> [].
analogs([A|As]) --> analog(A), analogs(As).

用法:

?- phrase(analogs(X), [1,1,1,0,1,1,1, 0,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1, 0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0, 1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1, 0,1,1,1]).
X = ['.', '.', '.', "", '.', '.', '.', "", ""|...] ;

无论如何,为了回答你的实际问题,Prolog可以通过这样的方式找出自己的长度:

signal_morse([], []).
signal_morse(Signals, [Code|RemainingMorseCodes]) :-
    append(Signal, RemainingSignals, Signals),
    analog(Signal, Code),
    signal_morse(RemainingSignals, RemainingMorseCodes).